1.消失的数字
以下是题目链接:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

首先来简单看一下这道题。这道题就是告诉我们,给出一个数组nums,数组里面有n个数字,这n个数字的内容就是一个连续的0~n,这个数组不一定是按顺序来的,但一定是0~n的数字。比如0,1,2,3,4,5,6。但是在这个数组里面就缺少了一个数字。现在题目的要求就是让我们找出这个数字。
对于这道题,我目前有三个思路。
思路1
先使用冒泡排序来把这个数组变成升序的数组,然后把i丢进去遍历数组内容,用当前的数字+1,如果不等于下一个数字,那么这个数字就是我们需要寻找的数字。但是当我想用这个思路的时候,计算了一下时间复杂度,发现这个思想的时间复杂度是O(N^2),并不符合题目的要求。
思路2
使用位运算的思想。首先,先让x = 0和数组里面的内容进行按位与的操作。最后让异或完后的x跟完整的0~9来进行异或运算,最终就会得出那个缺失的数字。
关于这个思想,说实话,我觉得也是挺复杂的。这就有点像我之前写过的单身狗2,这道题的要求就是在一个数组里面找出只出现过一次的数字,大概的思路也是用0跟数组里面的数字进行异或运算的操作,相同的数字就会消失,最后只剩下两个数字,再用位运算的方法把这两个数字分别输出。
异或的操作运算是碰到相同的数字就为0。于是我总结了一个规律,在用x = 0与数组的内容进行异或操作的时候,可以把x理解为一个袋子,把数组里面的数字一个一个地往袋子里面装,如果袋子里面装了两个相同的数字,则这两个数字就会被"湮灭"掉,消失不见。最后只剩下那个只出现过一次的数字。
那这道题的代码就可以写出来了
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,10 };
int x = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for ( i = 0; i < sz; i++)
{
x ^= arr[i];//首先把数组里面的数字一个个装进x这个袋子里面
}
for ( i = 0; i <= sz; i++)
{
x ^= i;//然后用x这个袋子里面的数字与完整的0~n来进行异或操作,如果有相同的
//则就会发生"湮灭",如果没有发现相同的,就输出那个数字,而那个输出
//的数字,恰好就是缺失的数字
}
printf("%d", x);
return 0;
}
思路3
这就涉及到一个数学角度的运算。
首先把不缺失数字的数组0~n进行一个和的相加,这里就用到了等差数列的相加,((头+尾)*个数)/2来算出总和,在让总和一个个地减去数组里面的数字,最后得出的就是缺失的数字。
int missingNumber(int* nums, int numsSize){
int sum = ((0 + numsSize)*(numsSize + 1))/2;
int sum1=0;
for(int i = 0;i<numsSize;i++)
{
sum-=nums[i];
}
return sum;
}
2.轮转数组
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

这个题看题目也很容易理解。
代码如下:
#include <stdio.h>
int main()
{
int arr[5] = { 1,2,3,4,5 };
int k = 0;
int temp = 0;
scanf("%d", &k);
int count = k;
int sz = sizeof(arr) / sizeof(arr[0]);
int newArr[5];
for (int i = 0; i<sz; i++)
{
newArr[(i + k) % sz] = arr[i];
}
for (int i = 0; i < sz; i++)
{
arr[i] = newArr[i];
}
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
水了水了~
文章介绍了在LeetCode平台上两道编程题目:如何通过冒泡排序、位运算和数学方法找到数组中缺失的数字,以及如何处理数组轮转问题。作者详细解释了每种思路的工作原理和代码实现。
1923

被折叠的 条评论
为什么被折叠?



