a*0
2 楼
穆迪谈到在和八马讨论social security agreement, 这个会包括h4 EAD吗? 我靠,不
会等到最后人家出一个agreement,h4EAD是India only的政策吧
会等到最后人家出一个agreement,h4EAD是India only的政策吧
h*g
3 楼
眼角膜算长好了吗?跳闪的话,有影响吗?
b*8
10 楼
感觉很像用位操作去解。。。
b*y
12 楼
careercup上的面经。。。感觉问的应该是把偶数index上的挪到后面
比如jacket->jceakt
给的例子太特殊了,估计是为了容易看懂?
比如jacket->jceakt
给的例子太特殊了,估计是为了容易看懂?
l*c
16 楼
for(int i = 0; pow(2,(i+2)) <= n; i++) {
for(int j = pow(2,i)+ 1; j < n; j = j +pow(2,(i+2))) {
for (int tmp = 0; tmp < pow(2,i); tmp++) {
swap(s[j], s[j+pow(2,i)]);
}
}
}
怎么觉得很难写啊,思路如下
a1b2c3d4.... -> ab12cd34 ->abcd1234
我算是抛个破砖吗
for(int j = pow(2,i)+ 1; j < n; j = j +pow(2,(i+2))) {
for (int tmp = 0; tmp < pow(2,i); tmp++) {
swap(s[j], s[j+pow(2,i)]);
}
}
}
怎么觉得很难写啊,思路如下
a1b2c3d4.... -> ab12cd34 ->abcd1234
我算是抛个破砖吗
a*y
18 楼
just swap at different stage with different position,常见提原体应该是
a1a2a3b1b2b3
a1a2a3b1b2b3
e*e
22 楼
Agree.
public void convert(char[] a) {
swap(a, 1, 2);
swap(a, 5, 6);
swap(a, 2, 4);
swap(a, 3, 5);
}
private void swap( char[] a, int i, int j ) {
char tmp = a[i]; a[i] = a[j]; a[j] = tmp;
}
【在 l****c 的大作中提到】
: for(int i = 0; pow(2,(i+2)) <= n; i++) {
: for(int j = pow(2,i)+ 1; j < n; j = j +pow(2,(i+2))) {
: for (int tmp = 0; tmp < pow(2,i); tmp++) {
: swap(s[j], s[j+pow(2,i)]);
: }
: }
: }
: 怎么觉得很难写啊,思路如下
: a1b2c3d4.... -> ab12cd34 ->abcd1234
: 我算是抛个破砖吗
public void convert(char[] a) {
swap(a, 1, 2);
swap(a, 5, 6);
swap(a, 2, 4);
swap(a, 3, 5);
}
private void swap( char[] a, int i, int j ) {
char tmp = a[i]; a[i] = a[j]; a[j] = tmp;
}
【在 l****c 的大作中提到】
: for(int i = 0; pow(2,(i+2)) <= n; i++) {
: for(int j = pow(2,i)+ 1; j < n; j = j +pow(2,(i+2))) {
: for (int tmp = 0; tmp < pow(2,i); tmp++) {
: swap(s[j], s[j+pow(2,i)]);
: }
: }
: }
: 怎么觉得很难写啊,思路如下
: a1b2c3d4.... -> ab12cd34 ->abcd1234
: 我算是抛个破砖吗
a*s
26 楼
你这个题目有歧义,首先问清楚abcd是不是要有顺序大小要求,1234也是一样,
c3a5d1 是不是要写成cad351
因为看上去是要排序的,要排序就不太可能O(n)了吧。
周一刚遇到一个偶数奇数群置换问题。确实只需要O(n)
伪代码:
1) 边界条件1: 全是字母
2) 边界条件2: 全是数字
3) 字母数字混合情况: 两个指针,一个指在字符串头,一个指在字符串尾,用
一个循环,如果第一个指针小于第二个指针(我只的是指针指的数组index大小)就循
环,循环里面怎么写,不用讲了吧。
c3a5d1 是不是要写成cad351
因为看上去是要排序的,要排序就不太可能O(n)了吧。
周一刚遇到一个偶数奇数群置换问题。确实只需要O(n)
伪代码:
1) 边界条件1: 全是字母
2) 边界条件2: 全是数字
3) 字母数字混合情况: 两个指针,一个指在字符串头,一个指在字符串尾,用
一个循环,如果第一个指针小于第二个指针(我只的是指针指的数组index大小)就循
环,循环里面怎么写,不用讲了吧。
m*k
28 楼
假设是不需要排序的,即数字和字母各在一边,保持原来顺序.
你能详细讲一下你的做法吗? 两个指针这个没看明白.
【在 a*****s 的大作中提到】
: 你这个题目有歧义,首先问清楚abcd是不是要有顺序大小要求,1234也是一样,
: c3a5d1 是不是要写成cad351
: 因为看上去是要排序的,要排序就不太可能O(n)了吧。
: 周一刚遇到一个偶数奇数群置换问题。确实只需要O(n)
: 伪代码:
: 1) 边界条件1: 全是字母
: 2) 边界条件2: 全是数字
: 3) 字母数字混合情况: 两个指针,一个指在字符串头,一个指在字符串尾,用
: 一个循环,如果第一个指针小于第二个指针(我只的是指针指的数组index大小)就循
: 环,循环里面怎么写,不用讲了吧。
你能详细讲一下你的做法吗? 两个指针这个没看明白.
【在 a*****s 的大作中提到】
: 你这个题目有歧义,首先问清楚abcd是不是要有顺序大小要求,1234也是一样,
: c3a5d1 是不是要写成cad351
: 因为看上去是要排序的,要排序就不太可能O(n)了吧。
: 周一刚遇到一个偶数奇数群置换问题。确实只需要O(n)
: 伪代码:
: 1) 边界条件1: 全是字母
: 2) 边界条件2: 全是数字
: 3) 字母数字混合情况: 两个指针,一个指在字符串头,一个指在字符串尾,用
: 一个循环,如果第一个指针小于第二个指针(我只的是指针指的数组index大小)就循
: 环,循环里面怎么写,不用讲了吧。
i*7
32 楼
今天碰到同样的题目。
对方说明如果是a3b4d2c1
最后排出来的要是abcd1234。。。
最后果断开了两个数组做counting sort。。然后我想应该就是O(n) O(1)了。
对方说明如果是a3b4d2c1
最后排出来的要是abcd1234。。。
最后果断开了两个数组做counting sort。。然后我想应该就是O(n) O(1)了。
i*7
34 楼
但其实如果是a3b4d2c1的话,我只能提出一个O(nlogn) O(1)的算法了。
题目其实和某个微软题类似,就是把正负数分开,但是顺序不变的那种
类似与mergesort的思想,然后swap range。
题目其实和某个微软题类似,就是把正负数分开,但是顺序不变的那种
类似与mergesort的思想,然后swap range。
d*0
35 楼
大公主到底好玩不,看评价好像毁誉参半呀
vn
38 楼
这个应该可以O(n)O(1)做出来
主要思路就是
0 1 2 3 4 5 6 7 变成
0 2 4 6 1 3 5 7
把1先存着用2顶 再把空出的2的位置用4顶。。。下一步在从3下手
必须一步到位
不可能一点一点的挪
但是具体算法 似乎很麻烦 有人想出来叫唤下~~
主要思路就是
0 1 2 3 4 5 6 7 变成
0 2 4 6 1 3 5 7
把1先存着用2顶 再把空出的2的位置用4顶。。。下一步在从3下手
必须一步到位
不可能一点一点的挪
但是具体算法 似乎很麻烦 有人想出来叫唤下~~
vn
40 楼
想想这些题就算真的实际出现了 如果不是特别需要performance 谁花那个时间做这种
优化啊
想着想着就觉得自己做题在浪费时间。。。
优化啊
想着想着就觉得自己做题在浪费时间。。。
b*y
42 楼
a*s
44 楼
public ArrayList groupSwap(ArrayList str, int i, int j){
int p1=0;
int p2=str.size()-1;
//first consider boundary condition 1 all belongs to group 1
while(Integer.parseInt(str.get(p1).toString())%2==1 && p1 p1++;
}
//then consider boundary condition 2 all belongs to group2
while(Integer.parseInt(str.get(p2).toString())%2==0 && p1 p2--;
}
if(p1==p2) return str;
//normal condition
else{
changeValue(str,p1,p2);
//for (int m:str) System.out.print(m+"\t");
p1++;
p2--;
while(p1 if(str.get(p1)%2==1){
p1++;
}
else {
changeValue(str,p1,p2);
p2--;
}
}
return str;
}
}
int p1=0;
int p2=str.size()-1;
//first consider boundary condition 1 all belongs to group 1
while(Integer.parseInt(str.get(p1).toString())%2==1 && p1
}
//then consider boundary condition 2 all belongs to group2
while(Integer.parseInt(str.get(p2).toString())%2==0 && p1
}
if(p1==p2) return str;
//normal condition
else{
changeValue(str,p1,p2);
//for (int m:str) System.out.print(m+"\t");
p1++;
p2--;
while(p1
p1++;
}
else {
changeValue(str,p1,p2);
p2--;
}
}
return str;
}
}
w*o
46 楼
置换很容易,但时间绝对不是O(n):
char[] A = {'a', '1','b', '2', 'c', '3', 'd', '4', 'e', '5', 'f', '6', 'g',
'7', 'h', '8', 'i', '9'};
int n = A.length; int mid = n / 2;
for(int i = 1; i < mid; i++)
{
for(int j = mid - i, k = mid; j < mid; j++, k++)
{
char ch = A[j];
A[j] = A[k];
A[k] = ch;
}
}
下面这个是一次置换到位,时间是O(n),但空间不是O(1):
int n = A.length; int mid = n / 2;
boolean[] visited = new boolean[mid - 1];
for (int k = visited.length - 1; k >= 0; k--)
{
if (visited[k]) continue;
int i = 2 * k + 1;
int rem = i;
char pre = A[i];
do {
if (i % 2 == 1)
{
visited[i / 2] = true;
i = mid + i / 2;
} else {
i = i / 2;
}
char ch = A[i];
A[i] = pre;
pre = ch;
} while (i != rem);
}
char[] A = {'a', '1','b', '2', 'c', '3', 'd', '4', 'e', '5', 'f', '6', 'g',
'7', 'h', '8', 'i', '9'};
int n = A.length; int mid = n / 2;
for(int i = 1; i < mid; i++)
{
for(int j = mid - i, k = mid; j < mid; j++, k++)
{
char ch = A[j];
A[j] = A[k];
A[k] = ch;
}
}
下面这个是一次置换到位,时间是O(n),但空间不是O(1):
int n = A.length; int mid = n / 2;
boolean[] visited = new boolean[mid - 1];
for (int k = visited.length - 1; k >= 0; k--)
{
if (visited[k]) continue;
int i = 2 * k + 1;
int rem = i;
char pre = A[i];
do {
if (i % 2 == 1)
{
visited[i / 2] = true;
i = mid + i / 2;
} else {
i = i / 2;
}
char ch = A[i];
A[i] = pre;
pre = ch;
} while (i != rem);
}
a*s
52 楼
big O的概念要弄清楚,否则很容易出错。
O(n)时间复杂度肯定是可以的,意思是只扫描一遍,参考俺的奇数偶数置换;
O(1)是空间复杂度,意思是只是用常数个额外的空间,跟输入字符串的大小无函数关
系你用10000个都没关系,但是这10000个必须是无论字符串多大,都是这么多。
O(n)时间复杂度肯定是可以的,意思是只扫描一遍,参考俺的奇数偶数置换;
O(1)是空间复杂度,意思是只是用常数个额外的空间,跟输入字符串的大小无函数关
系你用10000个都没关系,但是这10000个必须是无论字符串多大,都是这么多。
C*y
56 楼
还是没看懂
Integer.parseInt(str.get(p1).toString())%2==1
你传入的已经是int了,为啥要变成string然后在变成int
为什么要%2?
【在 a*****s 的大作中提到】
: public ArrayList groupSwap(ArrayList str, int i, int j){
: int p1=0;
: int p2=str.size()-1;
: //first consider boundary condition 1 all belongs to group 1
: while(Integer.parseInt(str.get(p1).toString())%2==1 && p1 : p1++;
: }
: //then consider boundary condition 2 all belongs to group2
: while(Integer.parseInt(str.get(p2).toString())%2==0 && p1 : p2--;
Integer.parseInt(str.get(p1).toString())%2==1
你传入的已经是int了,为啥要变成string然后在变成int
为什么要%2?
【在 a*****s 的大作中提到】
: public ArrayList
: int p1=0;
: int p2=str.size()-1;
: //first consider boundary condition 1 all belongs to group 1
: while(Integer.parseInt(str.get(p1).toString())%2==1 && p1
: }
: //then consider boundary condition 2 all belongs to group2
: while(Integer.parseInt(str.get(p2).toString())%2==0 && p1
j*9
60 楼
其实并没有这么复杂的。
假设initial array is 1c3a2d4b
首先我们知道字母a,和数字 1 应该在什么位置,换句话说:a 应该在index 0; 1应
该在 index length of array /2, 也就是在index 4
ok, 其他的字母和数字可以通过他们和a, 1 的distance, 找到它们应该在的位置,比
如说字母c应该在(c-a)+ 0 = 2, 数字 3应该在(3-1)+4 = 6.
ok,接下来就是要考虑到swap的问题了,我们从头开始遍历这个数组,1c3a2d4b
第一个item 是数字1,我们计算它应该在的位置(1-1)+4 = 4, 所以我们swap
with the item which is in index 4 that is 2, 所以现在变成2c3a1d4b, 我们可以
发现数字1已经到了它应该在的位置,我们在看这个时候的item,现在是数字2,ok,数
字2不属于这个位置,继续计算它应该在的位置(2-1)+4 = 5, 然后继续swap。一
直swap 到应该属于这个位置的数字或字母的出现。
ok,下一个问题是,我们要做多少次swap呢,最多n次(n = length of the array)
。 因为,我们每做一次swap,至少有一个数字或字母会到它们应该所在的位置。那么
我们最多只要做n次swap,就可以得到我们想要的sequence了。
time complexity : O(n)(遍历整个数组) + O(n)(最多做的swap)= O(n)
space complexity: apparently O(1)
假设initial array is 1c3a2d4b
首先我们知道字母a,和数字 1 应该在什么位置,换句话说:a 应该在index 0; 1应
该在 index length of array /2, 也就是在index 4
ok, 其他的字母和数字可以通过他们和a, 1 的distance, 找到它们应该在的位置,比
如说字母c应该在(c-a)+ 0 = 2, 数字 3应该在(3-1)+4 = 6.
ok,接下来就是要考虑到swap的问题了,我们从头开始遍历这个数组,1c3a2d4b
第一个item 是数字1,我们计算它应该在的位置(1-1)+4 = 4, 所以我们swap
with the item which is in index 4 that is 2, 所以现在变成2c3a1d4b, 我们可以
发现数字1已经到了它应该在的位置,我们在看这个时候的item,现在是数字2,ok,数
字2不属于这个位置,继续计算它应该在的位置(2-1)+4 = 5, 然后继续swap。一
直swap 到应该属于这个位置的数字或字母的出现。
ok,下一个问题是,我们要做多少次swap呢,最多n次(n = length of the array)
。 因为,我们每做一次swap,至少有一个数字或字母会到它们应该所在的位置。那么
我们最多只要做n次swap,就可以得到我们想要的sequence了。
time complexity : O(n)(遍历整个数组) + O(n)(最多做的swap)= O(n)
space complexity: apparently O(1)
m*x
61 楼
呵呵,看了半天,没看到make sense的答案。有人还老想着把这个问题trivialize成
a1b2c3d4的case,也不想想这样的问题还有什么意思?
这个题general的描述是:对一个偶数长度的数组,找到一个算法,把偶数位的元素移
到后半部分,奇数位的元素在前半部分。奇数位和偶数位各自内部相对次序保持不变。
基本思路有两种解法,一是通过permutation的思路找到变换的方法。这个有general解
法,针对所有的变换。对这个具体的问题,没有简易的方法。而且算法的核心在数学的
部分。
二是divide and conquer,前半后半各自分治之后,需要一个O(n)的操作对两部分子数
组做位置对调。这个调换的trick是类比字符串改变词的顺序。所以整体时间复杂度是n
*log(n). 这个方法适合写code,一般面试官的思路在这里。
这个问题大概一年前这个板上有过比较详尽的讨论,很多人给出了不错的想法。比较现
在,感觉牛人变少了。呵呵。
【在 b*******y 的大作中提到】
: 时间O(n)空间O(1)
: 咋整?
a1b2c3d4的case,也不想想这样的问题还有什么意思?
这个题general的描述是:对一个偶数长度的数组,找到一个算法,把偶数位的元素移
到后半部分,奇数位的元素在前半部分。奇数位和偶数位各自内部相对次序保持不变。
基本思路有两种解法,一是通过permutation的思路找到变换的方法。这个有general解
法,针对所有的变换。对这个具体的问题,没有简易的方法。而且算法的核心在数学的
部分。
二是divide and conquer,前半后半各自分治之后,需要一个O(n)的操作对两部分子数
组做位置对调。这个调换的trick是类比字符串改变词的顺序。所以整体时间复杂度是n
*log(n). 这个方法适合写code,一般面试官的思路在这里。
这个问题大概一年前这个板上有过比较详尽的讨论,很多人给出了不错的想法。比较现
在,感觉牛人变少了。呵呵。
【在 b*******y 的大作中提到】
: 时间O(n)空间O(1)
: 咋整?
g*e
62 楼
人家要O(n) time O(1) space,我想了半天也没想出来,以为众大牛们不屑回答这类简
单题了
是n
【在 m*x 的大作中提到】
: 呵呵,看了半天,没看到make sense的答案。有人还老想着把这个问题trivialize成
: a1b2c3d4的case,也不想想这样的问题还有什么意思?
: 这个题general的描述是:对一个偶数长度的数组,找到一个算法,把偶数位的元素移
: 到后半部分,奇数位的元素在前半部分。奇数位和偶数位各自内部相对次序保持不变。
: 基本思路有两种解法,一是通过permutation的思路找到变换的方法。这个有general解
: 法,针对所有的变换。对这个具体的问题,没有简易的方法。而且算法的核心在数学的
: 部分。
: 二是divide and conquer,前半后半各自分治之后,需要一个O(n)的操作对两部分子数
: 组做位置对调。这个调换的trick是类比字符串改变词的顺序。所以整体时间复杂度是n
: *log(n). 这个方法适合写code,一般面试官的思路在这里。
单题了
是n
【在 m*x 的大作中提到】
: 呵呵,看了半天,没看到make sense的答案。有人还老想着把这个问题trivialize成
: a1b2c3d4的case,也不想想这样的问题还有什么意思?
: 这个题general的描述是:对一个偶数长度的数组,找到一个算法,把偶数位的元素移
: 到后半部分,奇数位的元素在前半部分。奇数位和偶数位各自内部相对次序保持不变。
: 基本思路有两种解法,一是通过permutation的思路找到变换的方法。这个有general解
: 法,针对所有的变换。对这个具体的问题,没有简易的方法。而且算法的核心在数学的
: 部分。
: 二是divide and conquer,前半后半各自分治之后,需要一个O(n)的操作对两部分子数
: 组做位置对调。这个调换的trick是类比字符串改变词的顺序。所以整体时间复杂度是n
: *log(n). 这个方法适合写code,一般面试官的思路在这里。
C*y
63 楼
如果元素个数不是2^n的话,请问怎么如何用divide and conquer做?
是n
【在 m*x 的大作中提到】
: 呵呵,看了半天,没看到make sense的答案。有人还老想着把这个问题trivialize成
: a1b2c3d4的case,也不想想这样的问题还有什么意思?
: 这个题general的描述是:对一个偶数长度的数组,找到一个算法,把偶数位的元素移
: 到后半部分,奇数位的元素在前半部分。奇数位和偶数位各自内部相对次序保持不变。
: 基本思路有两种解法,一是通过permutation的思路找到变换的方法。这个有general解
: 法,针对所有的变换。对这个具体的问题,没有简易的方法。而且算法的核心在数学的
: 部分。
: 二是divide and conquer,前半后半各自分治之后,需要一个O(n)的操作对两部分子数
: 组做位置对调。这个调换的trick是类比字符串改变词的顺序。所以整体时间复杂度是n
: *log(n). 这个方法适合写code,一般面试官的思路在这里。
是n
【在 m*x 的大作中提到】
: 呵呵,看了半天,没看到make sense的答案。有人还老想着把这个问题trivialize成
: a1b2c3d4的case,也不想想这样的问题还有什么意思?
: 这个题general的描述是:对一个偶数长度的数组,找到一个算法,把偶数位的元素移
: 到后半部分,奇数位的元素在前半部分。奇数位和偶数位各自内部相对次序保持不变。
: 基本思路有两种解法,一是通过permutation的思路找到变换的方法。这个有general解
: 法,针对所有的变换。对这个具体的问题,没有简易的方法。而且算法的核心在数学的
: 部分。
: 二是divide and conquer,前半后半各自分治之后,需要一个O(n)的操作对两部分子数
: 组做位置对调。这个调换的trick是类比字符串改变词的顺序。所以整体时间复杂度是n
: *log(n). 这个方法适合写code,一般面试官的思路在这里。
Q*e
65 楼
其实出这样的题目恨无聊。
不知能搞出哈来。
欧用的编程题目是
写个程序,返回数组中最小的。
书上有的就免了。不是傻子都能找到。
不知能搞出哈来。
欧用的编程题目是
写个程序,返回数组中最小的。
书上有的就免了。不是傻子都能找到。
w*o
68 楼
完全同意mmx所说的。
如果只是把数字和字母分开,然后不按原顺序,而按大小顺序的话排列的话,那跟原字
符串有什么关系,完全可以撇开原串,自己构造就可以了。
是n
【在 m*x 的大作中提到】
: 呵呵,看了半天,没看到make sense的答案。有人还老想着把这个问题trivialize成
: a1b2c3d4的case,也不想想这样的问题还有什么意思?
: 这个题general的描述是:对一个偶数长度的数组,找到一个算法,把偶数位的元素移
: 到后半部分,奇数位的元素在前半部分。奇数位和偶数位各自内部相对次序保持不变。
: 基本思路有两种解法,一是通过permutation的思路找到变换的方法。这个有general解
: 法,针对所有的变换。对这个具体的问题,没有简易的方法。而且算法的核心在数学的
: 部分。
: 二是divide and conquer,前半后半各自分治之后,需要一个O(n)的操作对两部分子数
: 组做位置对调。这个调换的trick是类比字符串改变词的顺序。所以整体时间复杂度是n
: *log(n). 这个方法适合写code,一般面试官的思路在这里。
如果只是把数字和字母分开,然后不按原顺序,而按大小顺序的话排列的话,那跟原字
符串有什么关系,完全可以撇开原串,自己构造就可以了。
是n
【在 m*x 的大作中提到】
: 呵呵,看了半天,没看到make sense的答案。有人还老想着把这个问题trivialize成
: a1b2c3d4的case,也不想想这样的问题还有什么意思?
: 这个题general的描述是:对一个偶数长度的数组,找到一个算法,把偶数位的元素移
: 到后半部分,奇数位的元素在前半部分。奇数位和偶数位各自内部相对次序保持不变。
: 基本思路有两种解法,一是通过permutation的思路找到变换的方法。这个有general解
: 法,针对所有的变换。对这个具体的问题,没有简易的方法。而且算法的核心在数学的
: 部分。
: 二是divide and conquer,前半后半各自分治之后,需要一个O(n)的操作对两部分子数
: 组做位置对调。这个调换的trick是类比字符串改变词的顺序。所以整体时间复杂度是n
: *log(n). 这个方法适合写code,一般面试官的思路在这里。
w*o
69 楼
还是不明白大牛所说的,我只能做到O(n^2)+O(1),或者O(n)+O(n);我用了
Programming Pearls里的思想,但不能找到一个好的方法找到下一个起点,
麻烦大牛看看我前面的帖子,提点意见。
【在 m*x 的大作中提到】
: 呵呵,good question. 不过我前面已经提示了。
: 一个例子是如何把a1a2b1b2a3a4a5b3b4b5 convert 成 a1a2a3a4a5b1b2b3b4b5. 其实等
: 价于把b1b2a3a4a5转变为a3a4a5b1b2. O(n)time O(1)space.
: 这其实是一个两个words的reverse order问题,应该很简单吧?
Programming Pearls里的思想,但不能找到一个好的方法找到下一个起点,
麻烦大牛看看我前面的帖子,提点意见。
【在 m*x 的大作中提到】
: 呵呵,good question. 不过我前面已经提示了。
: 一个例子是如何把a1a2b1b2a3a4a5b3b4b5 convert 成 a1a2a3a4a5b1b2b3b4b5. 其实等
: 价于把b1b2a3a4a5转变为a3a4a5b1b2. O(n)time O(1)space.
: 这其实是一个两个words的reverse order问题,应该很简单吧?
w*x
70 楼
这题太难了,过吧
a*a
71 楼
这个程序可以满足要求,
前提是字符和数字交替出现,不排序(除非连续的字符数字)
不过有点缺陷。绝大多case能通过
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
const int SIZE=14;
int from,to=0;
char c1,c2;
char str[SIZE] = {'a','1','b','2','c','3','d','4','e','5','f','6','g','
7'};
for(int i=1;i {
if(to==0){
if(i % 2 ==1 || to==1)
{
from =i;
to=(i-1+SIZE)/2;
c1=str[to];
str[to]=str[i];
//inter=from;
c2=c1;
}
}
else
{
from =to;
if(from%2==1)
{
to=(from-1+SIZE)/2;
}
else
{
to=from/2;
}
c1=str[to];
str[to]=c2;
c2=c1;
//if (to==1) break;
}
}
return 0;
}
前提是字符和数字交替出现,不排序(除非连续的字符数字)
不过有点缺陷。绝大多case能通过
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
const int SIZE=14;
int from,to=0;
char c1,c2;
char str[SIZE] = {'a','1','b','2','c','3','d','4','e','5','f','6','g','
7'};
for(int i=1;i
if(to==0){
if(i % 2 ==1 || to==1)
{
from =i;
to=(i-1+SIZE)/2;
c1=str[to];
str[to]=str[i];
//inter=from;
c2=c1;
}
}
else
{
from =to;
if(from%2==1)
{
to=(from-1+SIZE)/2;
}
else
{
to=from/2;
}
c1=str[to];
str[to]=c2;
c2=c1;
//if (to==1) break;
}
}
return 0;
}
a*m
73 楼
肯定都是字符么?那用对照表int count[36]计数就行了。最后扫一遍对照标。
a*m
74 楼
他弄错了,如果这个是o(1)那么扫描数组找到第一个指定数字也就可以o(1)了。除非他
想cache结果。理由2只能说计算是否有重复是o(1)。
况。
【在 i*********7 的大作中提到】
: 我还记得版里面报过一个a家的题目。
: 是在圆周率的小数点后面取每连续四个数为一组,然后求第一次出现duplicate的情况。
: 可用hash_map做。但当时面试者回答算法复杂度为O(n)的时候面试官认为是错的,面试
: 官认为是O(1)
: 理由有二。
: 1. 圆周率是固定的,所以你总会在同样的点找到duplicate。
: 2. 这个理由更strong一点。四位数的组合分别就是0001~9999。也就是buffer的size固
: 定应该为9999的上限。所以是为O(1)
: 当然,我觉得这有些诡辩的意思。
: 看个人理解吧
想cache结果。理由2只能说计算是否有重复是o(1)。
况。
【在 i*********7 的大作中提到】
: 我还记得版里面报过一个a家的题目。
: 是在圆周率的小数点后面取每连续四个数为一组,然后求第一次出现duplicate的情况。
: 可用hash_map做。但当时面试者回答算法复杂度为O(n)的时候面试官认为是错的,面试
: 官认为是O(1)
: 理由有二。
: 1. 圆周率是固定的,所以你总会在同样的点找到duplicate。
: 2. 这个理由更strong一点。四位数的组合分别就是0001~9999。也就是buffer的size固
: 定应该为9999的上限。所以是为O(1)
: 当然,我觉得这有些诡辩的意思。
: 看个人理解吧
相关阅读