笔试算法题(29):判断元素范围1到N的数组是否有重复数字 & 计算整数的7倍
2014-05-24 09:40
471 查看
出题:一个长度为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);
解题:
出题:快速计算一个整数的7倍;
分析:乘法相对较慢,所以需要转换成移位操作和加减法操作:int temp=X; X<<3 - temp
解题:
分析:
解法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);
解题:
bool HasDup(int *array, int length, int cur) { if(cur==length) return false; if(array[cur]==cur) /** * 注意++cur的特性,如果是cur++则参数值是cur * 而不是cur+1 * */ return HasDup(array, length, ++cur); else if(array[cur]==array[array[cur]) return true; else { int temp; temp=array[cur]; array[cur]=array[temp]; array[temp]=temp; return HasDup(array,length,cur); } } int main() { int array[]={6,5,3,1,5,4,0}; if(HasDup(array,7,0)) printf("\nthere is duplication"); else printf("\nthere is no duplication"); return 0; }
出题:快速计算一个整数的7倍;
分析:乘法相对较慢,所以需要转换成移位操作和加减法操作:int temp=X; X<<3 - temp
解题:
/** * 小于等于0,直接返回false * 如果为2的次幂,则二进制表示中 * 有且仅有一位是1,当这个数减去1 * 则原有的1变成0,其右边的所有bit * 变成1,此时他们的&操作为0 * */ bool If2Power(int n) { if(n<=0) return false; /** * 注意&的优先级小于=,所以必须加括号 * */ if((n&(n-1))==0) return true; else return false; } /** * 实现乘法可以转换成移位操作,向左移动移K位 * 等于*(2^K),最后再加上或者减去差值 * 注意加括号 * */ int Times7(int n) { int t=n; return (n<<3)-t; } int main() { if(If2Power(4)) printf("\nyes"); else printf("\nno"); printf("\n21*7= %d",Times7(21)); return 0; }
相关文章推荐
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
- 判断一个整数数组中是否有重复数字出现的O(n)时间复杂度算法
- 给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)
- C++ - 一个非递减数组,下标从0到n,元素的取值范围为从0到n的整数,判断其中是否有重复元素
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- (笔试题)如何判断数组中是否存在重复元素
- 12、一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。 请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 时间复杂度为O(n)来判断数组a[N](1 <= a[i] <= N)中是否有重复元素 (某公司校园招聘笔试题目)
- 如何判断一个整数数组中是否有重复元素
- 一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素
- 在一个长度为10的整形数组中,已经放置好了任意10个整数。要求用户任意输入 一个整数,判断该数字是否在数组中。如果在,删除数组中该元素,并把后面的 元素往前挪。(让空出的位置在最后)
- 一个数组下标从0到n,元素为从0到n的整数,判断其中是否有重复元素。
- (六)一个判断整形数组中是否有重复数字的简单算法
- 如何判断一个整数数组中是否有重复元素
- 对于一个SIZE大小的数组,元素是[0,SIZE-1]区间内的整数,判断其中是否有重复元素
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)