外贸网站制作哪家好,dede网站地图不显示文章列表,陕西住房和城乡建设网站,搜索引擎营销概念本系列博客为个人刷题思路分享#xff0c;有需要借鉴即可。 1.目录大纲#xff1a;
2.题目链接#xff1a; T1#xff1a;消失的数字#xff1a;LINK T2#xff1a;旋转数组#xff1a;LINK
3.详解思路#xff1a; T1#xff1a; 思路1#xff1a;先排序#xf… 本系列博客为个人刷题思路分享有需要借鉴即可。 1.目录大纲
2.题目链接 T1消失的数字LINK T2旋转数组LINK
3.详解思路 T1 思路1先排序再与正常的数字相比较即可。 #define _CRT_SECURE_NO_WARNINGS 1
#includestdlib.h
#includestdio.hint int_cmp(const void* e1,const void* e2)
{return *(int*)e1 - *(int*)e2;
}int missingNumber(int* nums, int numsSize)
{//先排序qsort(nums,numsSize,sizeof(int),int_cmp);//生成正常的数组与之比较int i 0;int lose 0;for (i 0; i numsSize1; i){if (i ! nums[i]){lose i;break;}}return lose;
}int main()
{int arr[9] { 9,6,4,2,3,5,7,0,1 };int ret missingNumber(arr, sizeof(arr)/sizeof(arr[0]));printf(%d\n, ret);return 0;
}思路2先把正常数组数字全部加起来然后减去原数组的数字 int missingNumber(int* nums, int numsSize){//思路二先加起来然后减去即可得到消失的数字
int i 0;
int lose 0;
int sum 0;
//加上0到numsSize全部的数字
for(i 0;inumsSize1;i)
{sumi;
}
//减去原数组0到numsSize的数字
for(i 0;inumsSize;i)
{sum-nums[i];
}
//得到消失的数字
lose sum;
return lose;
} 思路3异或运算 前提知识 0 ^ X X;//任何数字跟0异或都是原来的数 X ^ X 0;//两个一样的数字进行异或得到的是0 X ^ Y ^ X Y;//异或操作满足交换律 int missingNumber(int* nums, int numsSize){// //思路二先加起来然后减去即可得到消失的数字
// int i 0;
// int lose 0;
// int sum 0;
// //加上0到numsSize全部的数字
// for(i 0;inumsSize1;i)
// {
// sumi;
// }
// //减去原数组0到numsSize的数字
// for(i 0;inumsSize;i)
// {
// sum-nums[i];
// }
// //得到消失的数字
// lose sum;
// return lose;//思路三异或操作
int i 0;
int lose 0;
//异或正常的数组
for(i 0;inumsSize1;i)
{lose^i;
}
//异或原来的数组
for(i 0;inumsSize;i)
{lose^nums[i];
}
//返回
return lose;
} T2 思路1借助一个变量一个一个挪动 void rotate(int* nums, int numsSize, int k) {int temp 0;int i 0;//旋转几次while (k--){//开始第一组挪动temp nums[numsSize - 1];//先把最后一个数字放到临时变量中for (i numsSize - 2; i 0; i--){nums[i1] nums[i];}//挪动数组往前一位nums[0] temp;//把临时变量中的值放到数组第一个}
}int main()
{int arr[7] { 1,2,3,4,5,6,7 };rotate(arr,7,3);int i 0;for (i 0; i 7; i){printf(%d , arr[i]);}return 0;
}思路2一步到位拷贝法 void rotate(int* nums, int numsSize, int k) {if(knumsSize)k%numsSize;//新数组拷贝int arr[numsSize];int i 0;for(i 0;inumsSize;i){arr[i] nums[i];}//覆盖原数组内容for(i 0;ik;i){nums[k-1-i] arr[numsSize-1-i];}for(i 0;inumsSize-k;i){nums[ki] arr[i];}
}思路3逆置 void Reverse(int* nums,int left,int right){while(leftright){nums[left] nums[left]^nums[right];nums[right] nums[left]^nums[right];nums[left] nums[left]^nums[right];left;right--;}}void rotate(int* nums, int numsSize, int k) {if(knumsSize)k%numsSize;//逆置前半部分Reverse(nums,0,numsSize-k-1);//逆置后半部分 4 6Reverse(nums,numsSize-k,numsSize-1);//逆置整体Reverse(nums,0,numsSize-1);}完。