出题:一个长度为N的数组,其中的元素取值范围是1到N,要求快速判断数组是否存在重复数字;
分析:
- 解法1:如果N个元素的范围都是在1到N,所以如果没有重复元素,则每一个位置恰好可以对应数组中的一个元素之,通过将当前元素k交换到其本身应该在的位
置k,也就是k=array[i],
array[array[i],并判断是否存在duplication或者已经就绪。时间复杂度O(N),空间复杂度O(1); - 解法2:由于元素取值范围确定,可以使用BitMap将数组元素映射到对应的位置,如果一个位置对应了两个元素,则有重复。时间复杂度和空间复杂度都是O(N);
- 解法3:先排序,O(NlogN),然后比较相邻元素是否相等,O(N);
解题:
1 bool HasDup(int *array, int length, int cur) {
2 if(cur==length) return false;
3
4 if(array[cur]==cur)
5 /**
6 * 注意++cur的特性,如果是cur++则参数值是cur
7 * 而不是cur+1
8 * */
9 return HasDup(array, length, ++cur);
10 else if(array[cur]==array[array[cur])
11 return true;
12 else {
13 int temp;
14 temp=array[cur];
15 array[cur]=array[temp];
16 array[temp]=temp;
17 return HasDup(array,length,cur);
18 }
19 }
20 int main() {
21 int array[]={6,5,3,1,5,4,0};
22 if(HasDup(array,7,0))
23 printf("\nthere is duplication");
24 else
25 printf("\nthere is no duplication");
26 return 0;
27 }
出题:快速计算一个整数的7倍;
分析:乘法相对较慢,所以需要转换成移位操作和加减法操作:int temp=X; X<<3 - temp
解题:
1 /**
2 * 小于等于0,直接返回false
3 * 如果为2的次幂,则二进制表示中
4 * 有且仅有一位是1,当这个数减去1
5 * 则原有的1变成0,其右边的所有bit
6 * 变成1,此时他们的&操作为0
7 * */
8 bool If2Power(int n) {
9 if(n<=0) return false;
10 /**
11 * 注意&的优先级小于=,所以必须加括号
12 * */
13 if((n&(n-1))==0) return true;
14 else return false;
15 }
16 /**
17 * 实现乘法可以转换成移位操作,向左移动移K位
18 * 等于*(2^K),最后再加上或者减去差值
19 * 注意加括号
20 * */
21 int Times7(int n) {
22 int t=n;
23 return (n<<3)-t;
24 }
25
26 int main() {
27 if(If2Power(4))
28 printf("\nyes");
29 else
30 printf("\nno");
31
32 printf("\n21*7= %d",Times7(21));
33 return 0;
34 }
时间: 2024-10-09 19:55:39