最近在牛客、力扣上做题,花费海量时间,苦不堪言,有时绞尽脑汁也想不出,痛定思痛,每日记录写的比较困难的题。
错误的集合
题目如上图所示
题主乍看之下觉得很简单,再看例子,不就是一个有序数组找重复和缺的吗,感觉很快就可以秒杀,殊不知,我已经死了。
看到例子之后题主先入为主,带偏了自己。注意审题!!
方法1:暴力循环,通过内层与外层双重for循环,因为题目明确说明是1~n的整数
故
static int arr[2];
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
*returnSize=2;
int i=0;
int j=0;
for(i=1;i<=numsSize;i++)//外层循环,从1开始
{
int count=0;//计数器
for(j=0;j<numsSize;j++)
{
if(i==nums[j])
count++;//对于i,出现相同时+1,正常情况下,count为1
}
if(count==2)//当为2时,说明出现重复
arr[0]=i;
if(count==0)//为0时,缺失
arr[1]=i;
}
return arr;
}
方法2.
利用冒泡排序(因为我学艺不精只会冒泡排序),将数组改写为有序数组,此时,
求重复数时,只需要遍历数组,与前一个比较即可得到
求被覆盖的数时
要进行分类讨论
1.当是开头丢失时
当是22时 比较nums[0]与1
2.当是末尾丢失时
当是1233时 比较nums[numssize-1]与numssize
3.当处在中间时
与前或后作差为2
例如
当是1224时 4-2=2
当为1334时 2-1=2
static int arr[2];
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
*returnSize=2;
int i=0;
int j=0;
int tmp=0;
for(i=0;i<numsSize-1;i++)//冒泡排序
{
for(j=0;j<numsSize-1-i;j++)
{
if(nums[j]>nums[j+1])
{
tmp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=tmp;
}
}
}
for(i=0;i<numsSize-1;i++)//找重复
{
if(nums[i]==nums[i+1])
{
arr[0]=nums[i];
break;
}
}
//找被覆盖的数,然后分情况
if(nums[0]!=1)
arr[1]=1;
if(nums[numsSize-1]!=numsSize)
arr[1]=numsSize;
for(i=1;i<numsSize;i++)
{
if(nums[i]-nums[i-1]==2)
{
arr[1]=nums[i]-1;
break;
}
}
return arr;
}
以后每天更新,若有不对请及时指出