笔试算法题(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中的多个点,查询的时候仅当所有的映 ...
随机推荐
- asp.net MVC 使用Bootstrap 分页
Boostrap分页控件比较美观, 控制器代码:使用仓储模式实现.如果是直接使用DbContext上下文使用更简单. public ActionResult Index(int? page,strin ...
- java笔记之线程方式1启动线程
* 需求:我们要实现多线程的程序. * 如何实现呢? * 由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来. * 而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程. * ...
- javascript使用正则表达式,从字符串提取内容,多数组解析
JavaScript有两种方式创建一个正则表达式: 第一种方式是直接通过/正则表达式/写出来,第二种方式是通过new RegExp('正则表达式')创建一个RegExp对象. 如: var re1 = ...
- javascript---DOM大编程2
编程挑战 现在利用之前我们学过的JavaScript知识,实现选项卡切换的效果. 效果图: 文字素材: 房产: 275万购昌平邻铁三居 总价20万买一居 200万内购五环三居 140万安家东三环 ...
- Python3进行RSA2加密、解密、签名
1.python3的PyCryptodome库用于密码学,属于对PyCrypto库的扩展 Linux上安装: pip install pycryptodome Windows上安装: pip inst ...
- [SDOI2016]墙上的句子
题目描述 考古学家发现了一堵写有未知语言的白色墙壁,上面有一个n行m列的格子,其中有些格子内被填入了某个A至Z的大写字母,还有些格子是空白的. 一直横着或竖着的连续若干个字母会形成一个单词,且每一行的 ...
- 解题报告:hdu 1073 Online Judge
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1073 Problem Description Ignatius is building an Onli ...
- ORA-00445: Background Process "xxxx" Did Not Start After 120 Seconds
Recent linux kernels have a feature called Address Space Layout Randomization (ASLR).ASLR is a feat ...
- 来自AJPFX的二分法查找
package com.heima.array; public class Demo2_Array { /** * * A:案例演示 * ...
- Java文件上传(基础性)
/** * * 上传文件 * */ public class FileUploadServlet2 extends HttpServlet { protected void doGet(HttpSer ...