由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 请教G家那题 abc123->a1b2c3
相关主题
reverse words in a string发个onsite面经 攒rp
为啥这个swap不可以?FaceBook面经--第一部分
a1b2c3d4 变abcd1234Amazon onsite面试的惨痛经历
BB家面经请教一题算法小问题
Amazon intern first phone interviewmerge两个有序数组
【一个BB公司问的字母排序的问题】问一题:merge两个有序数组
再问个简单的C问题收到G家拒信,发面经
问一道题昨天面试的一道题,find k missing numbers
相关话题的讨论汇总
话题: int话题: seq话题: char话题: swap话题: abc123
进入JobHunting版参与讨论
1 (共1页)
l****f
发帖数: 88
1
写了几次都没写出来, 太笨了。有没有大牛贴个简单明了的版本
150上的算法感觉也不对
A*****i
发帖数: 3587
2
分割开两部分一个一个拼不就完了?
t*******i
发帖数: 4960
3
Re

【在 A*****i 的大作中提到】
: 分割开两部分一个一个拼不就完了?
h*****a
发帖数: 1718
4
No additional space other than a few variables.

【在 A*****i 的大作中提到】
: 分割开两部分一个一个拼不就完了?
h*******e
发帖数: 1377
5
之前有讨论请考古。
l****f
发帖数: 88
6
这个不用extra space吗?

【在 A*****i 的大作中提到】
: 分割开两部分一个一个拼不就完了?
A*****i
发帖数: 3587
7
不用啊,如果是数组的话,用A[i+1] = A[i]一步一步把前面的往后挪就完了啊
就是复杂度有些高不能线性了。
如果一个字符一个node放在连表里就可以线性了。

【在 l****f 的大作中提到】
: 这个不用extra space吗?
h*******t
发帖数: 2679
8
原题是什么?
是不是这个思路:
char x='b';
char y='1';
x=x^y;
y=x^y;
x=x^y;
result ==> x = '1'; y='b';
这样可以不用extra space实现字符对调。

【在 l****f 的大作中提到】
: 写了几次都没写出来, 太笨了。有没有大牛贴个简单明了的版本
: 150上的算法感觉也不对

d*k
发帖数: 207
9
好久没来贡献了,刚好有时间来,和大家交流一下。
这个题需要一个巧妙的思路,如果想不到是无法解答的。个人认为这种depend solely
on one key observation的题目不适合当面试题,而且以我的能力,除非有很好的提示
,不可能想出来。
设原来的结构为
a1a2a3...anb1b2b3...bn,需要变换为a1b1a2b2a3b3...anbn。可以把左右两个数组看
做A和B,长度分别为n。现在把A和B都划分成两个长度为n/2的数组,则输入可表示为
A1A2B1B2。这里的四个数组长度都是n/2(n是奇数也则A2和B2的长度比A1和B1的长度少
1)。有算法可以在O(n)时间内inplace地交换A2和B1得到A1B1A2B2。之后递归地处理
A1B1和A2B2。时间复杂度分析,上面的递归时间代价可以表示为
T(n) = O(n/2) + 2 * T(n / 2)
因此T(n) = O(nlogn)。
关于inplace地交换A2和B1的算法,相信大家都知道了。首先将A2B1这部分反序,设A2
长度为p,B1长度为q。反序后的部分,先将前q个元素反序,再将后面的p个元素反序。
这时原序列已经变成B1A2了。
试一下online coding。
# inplace swap A2B1 to B1A2
def rev(seq, begin, p, q):
i = begin
j = begin + p + q - 1
while i < j:
seq[i], seq[j] = seq[j], seq[i]
i += 1
j -= 1
# recursive routine to solve the main problem
# idx is the first index of the sequence
# calling solve(seq, 0, len(seq)) will solve the original problem
def solve(seq, idx, size):
n = (size - idx) / 2
if n <= 1:
return
p = int(math.floor(n / 2))
q = int(math.ceil(n / 2))
begin = idx + q
rev(seq, begin, p, q)
solve(seq, idx, q * 2)
solve(seq, idx + q * 2, p * 2)
w*****5
发帖数: 75
10
Mark
相关主题
【一个BB公司问的字母排序的问题】发个onsite面经 攒rp
再问个简单的C问题FaceBook面经--第一部分
问一道题Amazon onsite面试的惨痛经历
进入JobHunting版参与讨论
y**********a
发帖数: 824
11
mark
y**********a
发帖数: 824
12
void swap(char[]A, int i, int j) {char c=A[i];A[i]=A[j];A[j]=c;}
void shuffleString(char[]A) {
for (int n=A.length,l=1,r=n/2;l for (int l=2,n=A.length;l while (A[l]!='A'+l/2)swap(A, l, (A[l]-'A')*2);
}
j********g
发帖数: 427
13
这种题,当你想据掉candidate的时候还是挺合适的

solely
A2

【在 d*k 的大作中提到】
: 好久没来贡献了,刚好有时间来,和大家交流一下。
: 这个题需要一个巧妙的思路,如果想不到是无法解答的。个人认为这种depend solely
: on one key observation的题目不适合当面试题,而且以我的能力,除非有很好的提示
: ,不可能想出来。
: 设原来的结构为
: a1a2a3...anb1b2b3...bn,需要变换为a1b1a2b2a3b3...anbn。可以把左右两个数组看
: 做A和B,长度分别为n。现在把A和B都划分成两个长度为n/2的数组,则输入可表示为
: A1A2B1B2。这里的四个数组长度都是n/2(n是奇数也则A2和B2的长度比A1和B1的长度少
: 1)。有算法可以在O(n)时间内inplace地交换A2和B1得到A1B1A2B2。之后递归地处理
: A1B1和A2B2。时间复杂度分析,上面的递归时间代价可以表示为

l****f
发帖数: 88
14
写了几次都没写出来, 太笨了。有没有大牛贴个简单明了的版本
150上的算法感觉也不对
A*****i
发帖数: 3587
15
分割开两部分一个一个拼不就完了?
t*******i
发帖数: 4960
16
Re

【在 A*****i 的大作中提到】
: 分割开两部分一个一个拼不就完了?
h*****a
发帖数: 1718
17
No additional space other than a few variables.

【在 A*****i 的大作中提到】
: 分割开两部分一个一个拼不就完了?
h*******e
发帖数: 1377
18
之前有讨论请考古。
l****f
发帖数: 88
19
这个不用extra space吗?

【在 A*****i 的大作中提到】
: 分割开两部分一个一个拼不就完了?
A*****i
发帖数: 3587
20
不用啊,如果是数组的话,用A[i+1] = A[i]一步一步把前面的往后挪就完了啊
就是复杂度有些高不能线性了。
如果一个字符一个node放在连表里就可以线性了。

【在 l****f 的大作中提到】
: 这个不用extra space吗?
相关主题
请教一题算法小问题收到G家拒信,发面经
merge两个有序数组昨天面试的一道题,find k missing numbers
问一题:merge两个有序数组interview Qs collection
进入JobHunting版参与讨论
h*******t
发帖数: 2679
21
原题是什么?
是不是这个思路:
char x='b';
char y='1';
x=x^y;
y=x^y;
x=x^y;
result ==> x = '1'; y='b';
这样可以不用extra space实现字符对调。

【在 l****f 的大作中提到】
: 写了几次都没写出来, 太笨了。有没有大牛贴个简单明了的版本
: 150上的算法感觉也不对

d*k
发帖数: 207
22
好久没来贡献了,刚好有时间来,和大家交流一下。
这个题需要一个巧妙的思路,如果想不到是无法解答的。个人认为这种depend solely
on one key observation的题目不适合当面试题,而且以我的能力,除非有很好的提示
,不可能想出来。
设原来的结构为
a1a2a3...anb1b2b3...bn,需要变换为a1b1a2b2a3b3...anbn。可以把左右两个数组看
做A和B,长度分别为n。现在把A和B都划分成两个长度为n/2的数组,则输入可表示为
A1A2B1B2。这里的四个数组长度都是n/2(n是奇数也则A2和B2的长度比A1和B1的长度少
1)。有算法可以在O(n)时间内inplace地交换A2和B1得到A1B1A2B2。之后递归地处理
A1B1和A2B2。时间复杂度分析,上面的递归时间代价可以表示为
T(n) = O(n/2) + 2 * T(n / 2)
因此T(n) = O(nlogn)。
关于inplace地交换A2和B1的算法,相信大家都知道了。首先将A2B1这部分反序,设A2
长度为p,B1长度为q。反序后的部分,先将前q个元素反序,再将后面的p个元素反序。
这时原序列已经变成B1A2了。
试一下online coding。
# inplace swap A2B1 to B1A2
def rev(seq, begin, p, q):
i = begin
j = begin + p + q - 1
while i < j:
seq[i], seq[j] = seq[j], seq[i]
i += 1
j -= 1
# recursive routine to solve the main problem
# idx is the first index of the sequence
# calling solve(seq, 0, len(seq)) will solve the original problem
def solve(seq, idx, size):
n = (size - idx) / 2
if n <= 1:
return
p = int(math.floor(n / 2))
q = int(math.ceil(n / 2))
begin = idx + q
rev(seq, begin, p, q)
solve(seq, idx, q * 2)
solve(seq, idx + q * 2, p * 2)
w*****5
发帖数: 75
23
Mark
y**********a
发帖数: 824
24
mark
y**********a
发帖数: 824
25
void swap(char[]A, int i, int j) {char c=A[i];A[i]=A[j];A[j]=c;}
void shuffleString(char[]A) {
for (int n=A.length,l=1,r=n/2;l for (int l=2,n=A.length;l while (A[l]!='A'+l/2)swap(A, l, (A[l]-'A')*2);
}
j********g
发帖数: 427
26
这种题,当你想据掉candidate的时候还是挺合适的

solely
A2

【在 d*k 的大作中提到】
: 好久没来贡献了,刚好有时间来,和大家交流一下。
: 这个题需要一个巧妙的思路,如果想不到是无法解答的。个人认为这种depend solely
: on one key observation的题目不适合当面试题,而且以我的能力,除非有很好的提示
: ,不可能想出来。
: 设原来的结构为
: a1a2a3...anb1b2b3...bn,需要变换为a1b1a2b2a3b3...anbn。可以把左右两个数组看
: 做A和B,长度分别为n。现在把A和B都划分成两个长度为n/2的数组,则输入可表示为
: A1A2B1B2。这里的四个数组长度都是n/2(n是奇数也则A2和B2的长度比A1和B1的长度少
: 1)。有算法可以在O(n)时间内inplace地交换A2和B1得到A1B1A2B2。之后递归地处理
: A1B1和A2B2。时间复杂度分析,上面的递归时间代价可以表示为

f**********t
发帖数: 1001
27
void abc123_(string &s, unsigned left, unsigned right) {
int num = right - left;
if (num < 3) {
return;
}
int mid = (left + right + 1) / 2;
int ll = left + (mid - left) / 2;
int rr = mid + (ll - left);
int i = ll;
for (int k = mid; k < rr; ++i, ++k) {
swap(s[i], s[k]);
}
if (i < mid) {
char temp = s[i];
for (int z = mid; z < rr; ++z) {
s[z - 1] = s[z];
}
s[rr - 1] = temp;
--mid;
}
abc123_(s, left, mid);
abc123_(s, mid, right);
}
void abc123(string &s) {
abc123_(s, 0, s.size());
}
s*********3
发帖数: 25
28
这个题就是一个2* 3 的矩阵转置成一个3*2的矩阵。
a b c
1 2 3
===>
a 1
b 2
c 3
如何实现矩阵的就地转置,网上搜一下就有了。
l*******a
发帖数: 36
r****7
发帖数: 2282
30
你都recursive了还谈啥constant space。。。
这个就是操作index,可以算出来的,和矩阵转置差不多。

solely

【在 d*k 的大作中提到】
: 好久没来贡献了,刚好有时间来,和大家交流一下。
: 这个题需要一个巧妙的思路,如果想不到是无法解答的。个人认为这种depend solely
: on one key observation的题目不适合当面试题,而且以我的能力,除非有很好的提示
: ,不可能想出来。
: 设原来的结构为
: a1a2a3...anb1b2b3...bn,需要变换为a1b1a2b2a3b3...anbn。可以把左右两个数组看
: 做A和B,长度分别为n。现在把A和B都划分成两个长度为n/2的数组,则输入可表示为
: A1A2B1B2。这里的四个数组长度都是n/2(n是奇数也则A2和B2的长度比A1和B1的长度少
: 1)。有算法可以在O(n)时间内inplace地交换A2和B1得到A1B1A2B2。之后递归地处理
: A1B1和A2B2。时间复杂度分析,上面的递归时间代价可以表示为

相关主题
Palantir面经为啥这个swap不可以?
Interview exposed上的code写的也不怎么样呀?a1b2c3d4 变abcd1234
reverse words in a stringBB家面经
进入JobHunting版参与讨论
w****k
发帖数: 755
31
You cannot recurse because space should be O(1). It has to be iterative.
Also, you can only solve a1b1a2b2.. . You cannot solve a1b1c1..
Here is my iterative solution:
Say original array is M. Then ai appears in M[i] and it should finally
appear in M[3i]; also bi from M[n+i] to M[3i+1], and ci from M[2n+i] to M[3i
+2].
With these in mind, we can start from a1, find its final position and put it
there after saving the value there. Then we can figure out for that value
where its final position, and put it there after saving ..repeat these steps
until you go back to your start point.
Then you should repeat the above steps starting from a2, and then you are
done.
Note, if the question has a,b,c then you need to work on first 3 elements.
If it's a,b,c,d, then work on first 4 elements, etc.

solely

【在 d*k 的大作中提到】
: 好久没来贡献了,刚好有时间来,和大家交流一下。
: 这个题需要一个巧妙的思路,如果想不到是无法解答的。个人认为这种depend solely
: on one key observation的题目不适合当面试题,而且以我的能力,除非有很好的提示
: ,不可能想出来。
: 设原来的结构为
: a1a2a3...anb1b2b3...bn,需要变换为a1b1a2b2a3b3...anbn。可以把左右两个数组看
: 做A和B,长度分别为n。现在把A和B都划分成两个长度为n/2的数组,则输入可表示为
: A1A2B1B2。这里的四个数组长度都是n/2(n是奇数也则A2和B2的长度比A1和B1的长度少
: 1)。有算法可以在O(n)时间内inplace地交换A2和B1得到A1B1A2B2。之后递归地处理
: A1B1和A2B2。时间复杂度分析,上面的递归时间代价可以表示为

p****a
发帖数: 447
32
这个不对
被换到右边的数,如果已经在合适的位置了,
继续换就错了.

【在 l*******a 的大作中提到】
: http://www.ardendertat.com/2011/10/18/programming-interview-que
k******e
发帖数: 145
33
Very good comment
Thanks

3i
it
steps

【在 w****k 的大作中提到】
: You cannot recurse because space should be O(1). It has to be iterative.
: Also, you can only solve a1b1a2b2.. . You cannot solve a1b1c1..
: Here is my iterative solution:
: Say original array is M. Then ai appears in M[i] and it should finally
: appear in M[3i]; also bi from M[n+i] to M[3i+1], and ci from M[2n+i] to M[3i
: +2].
: With these in mind, we can start from a1, find its final position and put it
: there after saving the value there. Then we can figure out for that value
: where its final position, and put it there after saving ..repeat these steps
: until you go back to your start point.

w**a
发帖数: 487
34
用StringBuilder算extra space么?
public static String googleABC(String test){
int len = test.length()/2;
StringBuilder res = new StringBuilder();
for(int i=0;i res.append(test.charAt(i)).append(test.charAt(i+len));
}

return res.toString();
}

【在 h*****a 的大作中提到】
: No additional space other than a few variables.
S*******C
发帖数: 822
35
StringBuilder肯定不能算extra space,不然这道题用JAVA无解,因为答案的长度就是
O(N)

【在 w**a 的大作中提到】
: 用StringBuilder算extra space么?
: public static String googleABC(String test){
: int len = test.length()/2;
: StringBuilder res = new StringBuilder();
: for(int i=0;i: res.append(test.charAt(i)).append(test.charAt(i+len));
: }
:
: return res.toString();
: }

h******o
发帖数: 30
36
这个方法很好。可以按照新的坐标来逐次更换原来数组中的每个元素。当然不用新数组
储存坐标,可以计算出来。

【在 s*********3 的大作中提到】
: 这个题就是一个2* 3 的矩阵转置成一个3*2的矩阵。
: a b c
: 1 2 3
: ===>
: a 1
: b 2
: c 3
: 如何实现矩阵的就地转置,网上搜一下就有了。

1 (共1页)
进入JobHunting版参与讨论
相关主题
昨天面试的一道题,find k missing numbersAmazon intern first phone interview
interview Qs collection【一个BB公司问的字母排序的问题】
Palantir面经再问个简单的C问题
Interview exposed上的code写的也不怎么样呀?问一道题
reverse words in a string发个onsite面经 攒rp
为啥这个swap不可以?FaceBook面经--第一部分
a1b2c3d4 变abcd1234Amazon onsite面试的惨痛经历
BB家面经请教一题算法小问题
相关话题的讨论汇总
话题: int话题: seq话题: char话题: swap话题: abc123