摘要:
题目是这样描述的:“水王”发帖的数目超过了所有帖子的一半,有各个帖子的作者ID,求这个水王的ID编程之美给出了两种巧妙的解法解法一:ID排序,那么ID列表中的N/2项即为要找的ID(还要排序,时间复杂度为O(NlogN))解法二:通过查找,每次从列表中除去两个不一样的ID,最后就可以得出这个ID,时间复杂度O(N)。写法上也有技巧,不必非要找到一个不一样的在继续下去,如果下一个一样,那么用一个变量记录这个次数,把次数+1,遇见不一样的-1。例如1,1,2,3,4 初始value =1,count =1,第二个1,value = 1,count =2,下一个2,value=1,count=1,下 阅读全文
摘要:
给定整数,判断是否是2的方幂。。我们来做分析:2->10 & 1->01 == 0 4->100 & 3->011 == 0 8->1000 & 7->0111 == 0 16->10000 & 15->01111 == 0是否看到规律呢。。n&(n-1)==0代码:int judge(int n){ return (n>0&&(n&(n-1)==0));} 阅读全文
摘要:
解法一:如果n!最末尾位0,则右移一位得到商,如果末尾是1,则不能被2整除,是奇数,这个问题等同与求n!中质有质因数2的个数。。最后结果再加1代码:#include<iostream>using namespace std;int main(){ int n,sum; sum=0; cin>>n; while(n) { n>>=1; sum+=n; } cout<<sum+1<<endl; system("pause"); return 0;}解法二:N减去N的二进制表示中1的数目,然后再加1。。这也是一个规律。. 阅读全文
摘要:
解法一:找出n!中质数2和质数5的个数,由于能被2整除的数的个数比能被5整除的数多的多,因为只需求出质数5的个数。利用Z=[Z/5]+[Z/25]+[Z/125]+....,其中[Z/5]表示<=z的数中含有质数5的个数。。代码:#include<iostream>using namespace std;int main(){ int n,sum; sum=0; cin>>n; while(n) { n/=5; sum+=n; } cout<<sum<<endl; system("pause"); return ... 阅读全文
摘要:
扩展问题:给定二进制数N,写下从1开始到N的所有二进制数,数一下其中出现的所有“1”的个数: f(1)=1 f(10)=10 (因为01,10,有两个1) f(11)=100 (因01,10,11,有四个1)解答:考虑f(1011):1,10,11,100,101,110,111,1000,1001,1010,1011 第一位上:高位数为101,每两个数就出现一个1,则出现101个1;且current位为1,低位数为0,所以5+1=6 第二位上:高位数为10,每四个数出现一个1,则出现(10)*2=4个1;且current位为1,... 阅读全文
摘要:
1、给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数?解法一:从1到N遍历,将每个数中含有“1”的个数加起来。。时间复杂度:O(n)*每个整数中“1”的个数复杂度=O(N*lgN)。。随着N增大,时间超越线性增长。。#include<iostream>using namespace std;int getNum(int n){ if(n==0) return 0; int num=0; while(n!=0) { num+=(n%10==1)?1:0; n/=10; } return nu... 阅读全文
摘要:
解法一:举例说明,为了减少复杂度,就使用八位二进制吧。设 A = 0010 1011, B = 0110 0101. 1. C = A & B = 0010 0001; 2. D = A | B = 0110 1111; 3. E = C ^ D = 0100 1110; 4. 结果E中有4个1,那么也就是说将A变成B,需要改变4位(bit)。 至于如何判断E的二进制表示中有几个1,可以采用快速移位与方法。 算法原理如下: 1. A & B,得到的结果C中的1的位表明了A和B中相同的位都是1的位; ... 阅读全文
摘要:
#include<iostream>using namespace std;/* Description: 解法一:求余法,时间复杂度O(lgn) 以10100010为例: 第一次除以2时,商为1010001,余数为0; 第二次除以2时,商为101000,余数为1; ...... 故,可以利用整形数据除法的特点,通过相除判断余数的值来分析。有如下代码: */int getNum1(int n){ if(n==0) return 0; int count=0; while(n) { if(n%2==1) { ... 阅读全文