赞
踩
拿到这道题我们有三种思路
1.先求和,在减
这种方法时间复杂度为O(N)
空间复杂度为O(1);
2.排序再遍历
qsort函数 空间复杂度O(logn n)
空间复杂度 O(log nn)
冒泡排序 空间复杂度O(logn²)
空间复杂度 O(1)
3.异或
例题 单身狗
这种方法时间复杂度为O(N)
空间复杂度为O(1)
int missingNumber(int* nums, int numsSize){
int num=(1+numsSize)*numsSize/2;
int i=0;
int sub=0;
for(i=0;i<numsSize;i++)
{
sub+=nums[i];
}
return num-sub;
}
int cmp(const void*p1,const void*p2) { return(*(int*)p1-*(int*)p2); } int missingNumber(int* nums, int numsSize){ qsort(nums,numsSize,sizeof(int),cmp); int i=0; for(i=0;i<numsSize;i++) { if(nums[i]!=i) { break; } } return i; }
int missingNumber(int* nums, int numsSize){ int i=0; int j=0; int n=numsSize; int x=0; for(i=0;i<numsSize;i++) { x^=nums[i]; } for(j=0;j<n+1;j++) { x^=j; } return x; }
找单身狗
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
#include<stdio.h> int main() { int arr[8] = { 1,1,2,2,3,3,4,5}; int sz = sizeof(arr) / sizeof(arr[0]); int x = 0; int i = 0; int pos = 0; for (i = 0; i < sz; i++) { x ^= arr[i]; } //x现在是两个单身狗异或的结果 for (i = 0; i < 32; i++) { if (((x >> i) & 1) == 1) { pos = i; break; } } //找到为1的那位,也就是两个单身狗二进制位不同的位置 int num1 = 0; int num2 = 0; //根据不同的位置将它们分开两组 for (i = 0; i < sz; i++) { if (((arr[i] >> pos) & 1) == 1) { num1 ^= arr[i];//异或得到结果 } else num2 ^= arr[i]; } printf("%d %d", num1, num2); return 0; }
void swap(int *nums,int left,int right) { int tmp=0; while(left<right) { tmp=nums[left]; nums[left]=nums[right]; nums[right]=tmp; left++; right--; } } void rotate(int* nums, int numsSize, int k) { k %= numsSize; swap(nums,0,numsSize-1); swap(nums,0,k-1); swap(nums,k,numsSize-1); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。