一.2的幂次方的基本定义 什么样的数为2的幂次方?例如2^0=1,2^1=2,2^2=4……,符合公式2^n(n>=0)的数称为2的幂次方. 如何判断一个数是否为2的幂次方呢?基本思路:把一个数不断的除以2,得到商与余数,若余数等于1,则这个数必然不是:若余数大于1,则继续除以2,直到商等于1.若商等于1且余数为0,则这个数为2的幂次方. 二.2的幂次方的判断方法 1:把一个数不断的除以2,得到商与余数,若余数等于1,则这个数必然不是:若余数大于1,则继续除以2,直到商等于1.若商等于1且余数为…
在写代码时遇到了“判断一个正整数是否是2的N次方”的问题,不想调用 java.lang 的 Math 类库进行浮点运算,觉得转换为浮点不是个好办法. 遂在网上搜索了一下,发现有人列出来好几种写法,列举几种: 1.通过循环除2:这种方法不值一提,略过: 2.针对32位/64位只有有限个 2 的N次方的常量值,逐个进行比较:额...这个也略过: 3.通过正则表达式进行文本匹配,判断是否2的后面都是 0 :这个绕得更远了... 最后,有一种最简洁优雅的写法:(value & (value -1)) =…
判断是否为正整数 JavaScript正则判断一串数字是否为正整数, 首先要明白这几个问题 1:javascript里会把一串数字前边的0自动屏蔽,(我不知道屏蔽这个词用的是否正确) console.log(000000123); //输出 123 2:javascript里最长的正整数长度为21位,再多就会用科学计数法进行计数 //这里是21位 console.log(1111111111111111111111) //输出 1.1111111111111111e+21 //这里是20位 co…
Description: 有2n个硬币和一个天平,其中有一个质量是m+1, 另一个硬币质量为m-1, 其余的硬币质量都是m. 要求:O(lgn)时间找出两枚假币 注意: n不一定是2的幂次方 算法1:O(n)算法 将2n个硬币分成n组(每组2个)进行称量: 结果只有两种: 1. 仅有一组出现天平不平衡: 一定就是 两个假币 2. 出现两组天平不平衡: 这四个硬币中必定存在两个假币.将重的硬币称量,轻的两个硬币称量得到结果. 算法2: O(lgn)算法 分治 首先假设n是2的幂次方(如果不是,则可…
最近招聘季,看JULY大哥的面试100题时,碰到这么一个扩展问题: 如何用一个语句判断一个整数是不是二的整数次幂?(此题在编程之美也有) easy, 2的整数次幂的二进制形式只有一个1,只要用i和i-1按位相与,结果为零就说明是: int i; bool b = (i&(i-1))?false:true; (===============只想知道这道题的解法的看到这里就够了,以下都是无关内容===============) 再下一步之前,请思考一个问题:printf("%d",…
对于一个int数组,请编写一个选择排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 冒泡排序: package test; public class BubbleSort { public int[] bubbleSort(int[] A, int n) { int temp; for (int j = 0; j < n - 1; j++) { for (int i = 0; i < n…
1.问题描述: 对于著名的图的m着色,有两个主要的问题,一个是图的m色判定问题,一个是图的m色优化问题,描述如下. 图的m色判定问题: 给定无向连通图G和m种颜色.用这些颜色为图G的各顶点着色.问是否存在着色方法,使得G中任2邻接点有不同颜色. 图的m色优化问题:给定无向连通图G,为图G的各顶点着色, 使图中任2邻接点着不同颜色,问最少需要几种颜色.所需的最少颜色的数目m称为该图的色数. 对于网上或书上的一些求解方式主要用贪心算法求解的方式,也有用回溯法的方式(一般不用,时空太大).如这位博主 …
我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下. 但我一直不明白这是怎么算出来的,因此通过阅读<算法导论-第2版>的2.2节,使用对插入排序最佳时间复杂度推算的方法,来计算冒泡排序的复杂度. 1. <算法导论>2.2中对插入排序最佳时间复杂度的推算 在最好情况下,6和7总不被执行,5每次只被执行1次.因此, 时间复杂度为O(n) 2. 冒泡排序的时间复杂度 2.1 排序代码 public void bubbleSort(int arr[]) {…
出题:一个长度为N的数组,其中的元素取值范围是1到N,要求快速判断数组是否存在重复数字: 分析: 解法1:如果N个元素的范围都是在1到N,所以如果没有重复元素,则每一个位置恰好可以对应数组中的一个元素之,通过将当前元素k交换到其本身应该在的位 置k,也就是k=array[i], array[array[i],并判断是否存在duplication或者已经就绪.时间复杂度O(N),空间复杂度O(1): 解法2:由于元素取值范围确定,可以使用BitMap将数组元素映射到对应的位置,如果一个位置对应了两…
出题:判断一个单向链表是否有环,如果有环则找到环入口节点: 分析: 第一个问题:使用快慢指针(fast指针一次走两步,slow指针一次走一步,并判断是否到达NULL,如果fast==slow成立,则说明链表有环): 第二个问题:fast与slow相遇时,slow一定还没有走完一圈(反证法可证明):   示意图 A为起始点,B为环入口点,C为相遇点,则a1=|AB|表示起始点到换入口的距离,a2=|CB|表示相遇点到环入口点的距离,s1=|AB|+|BC|表示slow指针走的长度,s2表示fast…