最近在牛客、力扣上做题,花费海量时间,苦不堪言,有时绞尽脑汁也想不出,痛定思痛,每日记录写的比较困难的题。
错误的集合
题目如上图所示
题主乍看之下觉得很简单,再看例子,不就是一个有序数组找重复和缺的吗,感觉很快就可以秒杀,殊不知,我已经死了。
看到例子之后题主先入为主,带偏了自己。注意审题!!
方法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;
}
以后每天更新,若有不对请及时指出