首页 > 代码库 > 笔试算法题(29):判断元素范围1到N的数组是否有重复数字 & 计算整数的7倍
笔试算法题(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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。