2020-09-30

本文介绍了利用异或操作找出1到1000范围内唯一重复数字的O(N)时间复杂度算法,以及如何用栈计算正整数二进制中1的个数和判断2的整数次方。还涉及浮点数转二进制和数组中唯一数字的查找,通过实例展示了相关技术的应用。
摘要由CSDN通过智能技术生成

1.1001个数在范围[1,1000],只有一个数出现两次,其余都出现一次,找出这个数,时间o(N) 且不使用额空间。
思路:把[1,1000]这1000个数目标的1001个数异或 所得值就是目标答案。(相同数^为0)

#include <iostream>
#include<algorithm>
#include<ctime>
using namespace std;
const int N = 1000;
int array[N + 2] = { 0 };
void show(int array[],int N){
	for (int i = 1; i <=N;i++){
		cout << array[i] << " ";
	}
	cout << endl;
}
int main()
{
	srand(time(NULL));
	int x = 0;
	for (int i = 1; i <= N; i++){
		array[i] = i;
		x = x^i;
	}
	array[N+1] = rand() % (N+1);
	show(array, N+1);
	for (int i = 1; i <= N + 1; i++){
		x ^= array[i];
	}
	cout << x << endl;
	system("pause");
	return 0;
}

2.一个正整数二进制中1的个数

#include <iostream>
#include <stack>
using namespace std;
int n;
void show(stack<int>&s){
	while (!s.empty()){
		cout << s.top();
		s.pop();
	}
	cout << endl;
}
int num_of_one(int &n){
	int res = 0;
	while (n){
		n =n&
			(n - 1);
		res++;
	}
	return res;
}
int main()
{
	stack<int>s;
	cin >> n;
	int temp = n;
	while (temp){
		int mod = temp % 2;
		s.push(mod);
		temp /= 2;
	}
	show(s);//显示二进制
	cout << num_of_one(n) << endl;
	system("pause");
	return 0;
}

3.判断一个数是不是2的整数次方(一条语句)

return (n&(n-1)==0)

4.将一个在范围(0,1)中的小数,转化为二进制 例如:0.625----->0.101
思路:浮点数(小于1)转二进制,n *=2 如果 n>=1 ,浮点数为1 结果为0.1XXXX,然后n-=1;
如果n<0,浮点数为0;
循环直到(n==0)可能n永远不会等于0,一般二进制结束位数小于32即可

例:0.625x2 = 1.25    n>=1    对应浮点数1     0.1    n-=1     n变为0.25
    0.25x2 = 0.5      n<1    对应     0     0.10    
    0.5x2 = 1.0		  n>=1    对应1          0.101   n-=1     n变为0   结束
#include <iostream>
#include <stack>
#include <string>
using namespace std;
double n;
string s = "0.";
void func(double n){
	int count = 0;
	while (n&&count<32){
		n *= 2;
		if (n >= 1){
			s += '1';
			n -= 1;
		}
		else{
			s += '0';
		}
		count++;
	}
}
int main()
{
	cin >> n;
	if (abs(n) > 1)
		return 0;
	func(n);
	cout << s << endl;
	system("pause");
	return 0;
}


5.数组中只有一个数字出现一次,其他都出现K次,输出这个数字。
map

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值