摘要:实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。例子:func(7) = 4,可以证明最少需要4次运算n = 7n-1 6n/2 3n-1 2n/2 1要求:实现函数(实现尽可能高效) int func(unsign int n);n为输入,返回最小的运算次数。给出思路(文字描述),完成代码,并分析你算法的时间复杂度。http://www.360doc.com/content/10/0909/18/2982742_52434261.shtmlhttp://www.cnblogs.com/dartagna 阅读全文
转:二进制乘法原理
2013-09-02 22:53 by youxin, 1429 阅读, 0 推荐, 收藏,
摘要:二进制乘法实际上就是左移和加法,假设被乘数是a,我们将乘数分解为2^n + 2^m + 2^k ...,则乘法结果为:a<<n + a<<m+a<<k ... ,以下题为例:4. What is the result of binary number 01011001 after multiplying by 0111001 and adding 1101110?(A) 0001 0100 0011 1111(B) 0101 0111 0111 0011(C) 0011 0100 0011 0101其乘法过程就是: 01011001<<5 + 0 阅读全文
面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
2013-09-02 22:49 by youxin, 8704 阅读, 0 推荐, 收藏,
摘要:题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同。时间复杂度为O(nlogn),空间复杂度为O(1)。方法2.使用bitmap方法。定义长度为N/8的char数组,每个bit表示对应数字是否出现过。遍历数组,使用 bitmap对数字是否出现进行统计。时间复杂度为O(n),空间复杂度为O(n)。方法3.遍历数组,假设第 i 个位置的数字为 j ,则通过交换将 j 换到下标为 j 的位置上。直到所有数字都出现在自己对应的下标处,或发生了冲突。时间复杂度为O(n),空间复杂度为 阅读全文
位运算技巧3
2013-09-02 21:40 by youxin, 983 阅读, 0 推荐, 收藏,
摘要:检测一个无符号数是不为2^n-1(^为幂):x&(x+1)将最右侧0位改为1位:x | (x+1)二进制补码运算公式:-x = ~x + 1 = ~(x-1)~x = -x-1-(~x) = x+1~(-x) = x-1x+y = x - ~y - 1= (x|y)+(x&y)x-y = x + ~y + 1 = (x|~y)-(~x&y)x^y = (x|y)-(x&y)x|y = (x&~y)+yx&y = (~x|y)-~xx==y:~(x-y|y-x)x!=y:x-y|y-xx> 31 ;return (x^y)-y ;//or: 阅读全文
位运算技巧2
2013-09-02 21:36 by youxin, 728 阅读, 0 推荐, 收藏,
摘要:题目:一个数组中有多个整数,其中只有一个没有重复过,求出该数:考虑使用异或操作帮助实现。int AppearOnce(int data[], int length){ int i; int once = 0; for (i = 0; i T abs_Normal(T tNum){if(tNum>0.0)returntNum;elsereturn-tNum;}也就是说我们会用到一个if-else判断来决定是否反转符号位。在3D游戏软件,或一些对性能要求比较高的底层系统中,当大规模的求绝对值时,这个if-else结构会带来性能上的损失,那么,如何来消除if-else结构呢?或许会... 阅读全文
如果函数的参数是一个指针,不要指望用该指针去申请动态内存
2013-09-02 00:29 by youxin, 834 阅读, 1 推荐, 收藏,
摘要:如果函数的参数是一个指针,不要指望用该指针去申请动态内存。Test函数的语句GetMemory(str, 200)并没有使str 获得期望的内存,str 依旧是NULL,为什么?void GetMemory(char *p, int num){p = (char *)malloc(sizeof(char) * num);}void Test(void){char *str = NULL;GetMemory(str, 100); // str 仍然为 NULLstrcpy(str, "hello"); // 运行错误}毛病出在函数 GetMemory 中。编译器总是要为函数的 阅读全文
位运算 技巧1
2013-09-02 00:22 by youxin, 448 阅读, 0 推荐, 收藏,
摘要:如果要对一个整数中的某些位进行操作,怎样表示这些位在整数中的位置呢?可以用掩码(Mask)来表示。比如掩码0x0000ff00表示对一个32位整数的8~15位进行操作,举例如下。1、取出8~15位。unsigned int a, b, mask = 0x0000ff00;a = 0x12345678;b = (a & mask) >> 8; /* 0x00000056 */这样也可以达到同样的效果:b = (a >> 8) & ~(~0U void main(){int a=-2147483647;a=a<<1;printf("%d 阅读全文
野指针?空指针?
2013-09-01 23:51 by youxin, 1681 阅读, 0 推荐, 收藏,
摘要:野指针指的是指向不可用内存的指针。任何指针变量在被创建时,不会自动成为NULL指针(空指针),其缺省值是随机的,所以,指针变量在创建的同时应当被初始化,或者将指针设置为NULL,或者让它指向合法的内存,而不应该放之不理,否则就会成为野指针。而同时由于指针被释放(free或delete)后,未能将其设置为为NULL,也会导致该指针变为野指针。虽然free和delete把指针所指的内存给释放掉了,但它们并没有把指针本身干掉,一般可以采用语句if (p != NULL)进行防错处理,但是if语句却起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。第三种造成野指针的原因是指针操作超越 阅读全文
面试题:位操作实现四则运算
2013-09-01 23:05 by youxin, 7262 阅读, 1 推荐, 收藏,
摘要:首先看一个面试题:题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。分析:这又是一道考察发散思维的很有意思的题目。当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关键所在。看到的这个题目,我的第一反应是傻眼了,四则运算都不能用,那还能用什么啊?可是... 阅读全文
面试题:递归颠倒栈 与栈排序
2013-09-01 22:01 by youxin, 2219 阅读, 0 推荐, 收藏,
摘要:题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。分析:乍一看到这道题目,第一反应是把栈里的所有元素逐一pop出来,放到一个数组里,然后在数组里颠倒所有元素,最后把数组中的所有元素逐一push进入栈。这时栈也就颠倒过... 阅读全文
浙公网安备 33010602011771号