笔试算法题(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);
解题:
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[]={,,,,,,};
if(HasDup(array,,))
printf("\nthere is duplication");
else
printf("\nthere is no duplication");
return ;
}
出题:快速计算一个整数的7倍;
分析:乘法相对较慢,所以需要转换成移位操作和加减法操作:int temp=X; X<<3 - temp
解题:
/**
* 小于等于0,直接返回false
* 如果为2的次幂,则二进制表示中
* 有且仅有一位是1,当这个数减去1
* 则原有的1变成0,其右边的所有bit
* 变成1,此时他们的&操作为0
* */
bool If2Power(int n) {
if(n<=) return false;
/**
* 注意&的优先级小于=,所以必须加括号
* */
if((n&(n-))==) return true;
else return false;
}
/**
* 实现乘法可以转换成移位操作,向左移动移K位
* 等于*(2^K),最后再加上或者减去差值
* 注意加括号
* */
int Times7(int n) {
int t=n;
return (n<<)-t;
} int main() {
if(If2Power())
printf("\nyes");
else
printf("\nno"); printf("\n21*7= %d",Times7());
return ;
}
笔试算法题(29):判断元素范围1到N的数组是否有重复数字 & 计算整数的7倍的更多相关文章
- 笔试算法题(17):奇偶数分置数组前后段 & 反序访问链表
出题:输入一个数组,要求通过交换操作将奇数索引的元素调整到数组前半部分,偶数索引的元素调整到数组后半部分: 分析: 当然如果没有额外要求的话很容易实现,最好使用In-Place的实现策略:考虑插入排序 ...
- 笔试算法题(07):还原后序遍历数组 & 半翻转英文句段
出题:输入一个整数数组,判断该数组是否符合一个二元查找树的后序遍历(给定整数数组,判定其是否满足某二元查找树的后序遍历): 分析:利用后序遍历对应到二元查找树的性质(序列最后一个元素必定是根节点,从左 ...
- 笔试算法题(37):二叉树的层序遍历 & 最长递增的数字串
出题:要求层序遍历二叉树,从上到下的层次,每一层访问顺序为从左到右,并将节点一次编号,输出如下:如果只要求打印指定的level的节点,应该如何实现. a b c d e f g h i 分 ...
- 笔试算法题(26):顺时针打印矩阵 & 求数组中数对差的最大值
出题: 输入一个数字矩阵,要求从外向里顺时针打印每一个数字: 分析: 从外向里打印矩阵有多重方法实现,但最重要的是构建合适的状态机,这样才能控制多重不同的操作: 注意有四种打印模式(左右,上下,右左, ...
- C/C++面试之算法系列--去除数组中的重复数字
去除数组中的重复数字 Sailor_forever sailing_9806@163.com 转载请注明 http://blog.csdn.net/sailor_8318/archive/2008/ ...
- 笔试算法题(21):将stack内外颠倒 & 判断扑克牌顺子
出题:要求用递归将一个栈结构的元素内外颠倒: 分析: 本题再次说明系统栈是程序员最好的帮手,但递归度较高所以时间复杂度较大,可以使用空间换时间的方法(额外数组保存栈元素,然后逆向压入): 第一层递归( ...
- 前端如何应对笔试算法题?(用node编程)
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...
- 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)
议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
- 笔试算法题(43):布隆过滤器(Bloom Filter)
议题:布隆过滤器(Bloom Filter) 分析: BF由一个很长的二进制向量和一系列随机映射的函数组成,通过多个Hash函数将一个元素映射到一个Bit Array中的多个点,查询的时候仅当所有的映 ...
随机推荐
- html title属性
<table class="table table-hover table-striped"> @foreach (var article in Model) { &l ...
- ubuntu16.04下使用python3开发时,安装pip3与scrapy,升级pip3
1)安装pip3: sudo apt-get install python3-pip 2)安装scrapy sudo pip3 install scrapy 若出现版本过低问题: pip3 insta ...
- J201700525-hm
スケルトン 骨組み(ほねぐみ) 骨架 リソース 资源
- 洛谷 P3825 [NOI2017]游戏 【2-SAT+状压】
UOJ和洛谷上能A,bzoj 8ms即WA,现在也不是知道为啥--因为我太弱了 先看数据范围发现d非常小,自然想到了状压. 所以先假装都是只能跑两种车的,这显然就是个2-SAT问题了:对于x场没有hx ...
- 身份认证系统(四)OAuth2运行流程
上一节介绍过什么是OAuth2,这节准备用生动的事例来告诉大家OAuth2运行的流程. 我们来想这样一个场景:假设我们有一个叫做万方网盘的服务是用来帮助用户存储论文文档的,我们向外提供了符合OAuth ...
- [POJ2750]Potted Flower
Description The little cat takes over the management of a new park. There is a large circular statue ...
- Poj 2594 Treasure Exploration (最小边覆盖+传递闭包)
题目链接: Poj 2594 Treasure Exploration 题目描述: 在外星上有n个点需要机器人去探险,有m条单向路径.问至少需要几个机器人才能遍历完所有的点,一个点可以被多个机器人经过 ...
- 光盘安装ubuntu出现busybox-initramfs不能继续安装的终极解决方法
我用的是Intel G45的主板,可能是板子太新的原因,kernel支持有问题 从光盘(官方寄来的光盘)安装ubuntu,出现提示: BusyBox V1.1.3 (Debian 1:1.1.3-5u ...
- CentOS安装GlassFish4.0 配置JDBC连接MySQL
转自:http://linux.it.net.cn/CentOS/course/2014/0724/3319.html 版本glassfish-4.0.zip 1.解压,拷贝到指定安装路径 unz ...
- PHP 官方说明
http://php.net/manual/en/mysqli.affected-rows.php The above examples will output: Affected rows (INS ...