笔试算法题(29):判断元素范围1到N的数组是否有重复数字 & 计算整数的7倍

出题:一个长度为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 }

 

posted @ 2014-05-24 09:40  Leo C.  阅读(1807)  评论(0编辑  收藏  举报