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