文章目录
1、如何判断一个数是否是2的n次方O(1)算法
当一个数为2的n 次方时,整个二进制数,只有本位是1 其他位为0,如果我们给这个数减一,那么本位变为0 其他位全部变成1;我们可以通过&运算, 如果为0即为2的n次方;
def is2n(self, n):
if n == 0:
return True
res = n & (n-1)
return res==0
或者直接通过:
return bitset<32>(n).count() == 1
就可以检测
2、如何不新建第三个变量而交换a,b两个变量内的值
a=a+b;
b=a-b;
a=a-b;
3、有100个乒乓球,两个人,每个人每次只能拿[1, 5]个球,最后一次把球拿完的获胜,问怎么先手必胜?
根据以上分析,把100分成6个一组,余数是几,我就先拿几个,
100÷6=16(组)…4(个)
先拿4个,他拿1~5中的n个,我拿6-n,依此类推,保证我能得到第100个乒乓球。
先手必胜类题目,leetcode上面有很多:
LeetCode第 292 题:Nim游戏(C++)_zj-CSDN博客
leetcode 第 1025 题:除数博弈(C++)_zj-CSDN博客
4、有2.5亿个数,其中只有一个数出现两次,其他的数都出现一次。在内存紧张的情况下,怎么找出这个重复数?
位运算:
//位运算应用
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
int n;
int a[maxn];
void found(){
int xors = 0;
for (int i = 0; i<n; i++){
xors ^= a[i];
}
for (int i = 0; i<n; i++){
xors ^= i;//注意这儿
}
printf("xors= %d\n", xors);
}
int main()
{
cin >> n;
for (int i = 0; i <= n; i++)
cin >> a[i];
found();
return 0;
}
两层for循环,比如:
第一层异或:123345
第二层异或:12345
总的来说,只有3出现了3次,其他的都是两次
有点像LeetCode第 268 题:缺失数字(C++)_zj-CSDN博客
5、bitmap解决一道海量数据处理面试题:在2.5亿个整数中找出不重复的整数
采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32 * 2 bit=1 GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。
6、出租车一分钟来的概率是p,三分钟来的概率是多少?
1-(1-p)^3
7、100层丢玻璃球–两个玻璃球怎么才能用最少次数求出来玻璃球破碎的临界值
问题:
有一栋100层高的大楼,给你两个完全相同的玻璃球。假设从某一层开始,丢下玻璃球会摔碎。
那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层?
100层高的大楼,丢玻璃球的问题_其实我也有梦想-CSDN博客
这个解析说的挺好了。
关键点在于均匀。
8、大小端判断
#include <iostream>
#include <arpa/inet.h>
using namespace std;
int main(){
unsigned int x = 0x12345678;
cout << hex << x << endl;
unsigned char *p = (unsigned char*)&x;
if(*p == 0x12) cout << "大端" << endl;
else if(*p == 0x78) cout << "小端" << endl;
unsigned int y = htonl(x);
cout << hex << y << endl;
return 0;
}