其他题目记录

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、大小端判断

大小端_hgxy123的博客-CSDN博客

#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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值