2150. 找出数组中的所有孤独数字
给你一个整数数组 nums 。如果数字 x 在数组中仅出现 一次 ,且没有 相邻 数字(即,x + 1 和 x - 1)出现在数组中,则认为数字 x 是 孤独数字 。
返回 nums 中的 所有 孤独数字。你可以按 任何顺序 返回答案。
示例 1:
输入:nums = [10,6,5,8]
输出:[10,8]
解释:
- 10 是一个孤独数字,因为它只出现一次,并且 9 和 11 没有在 nums 中出现。
- 8 是一个孤独数字,因为它只出现一次,并且 7 和 9 没有在 nums 中出现。
- 5 不是一个孤独数字,因为 6 出现在 nums 中,反之亦然。
因此,nums 中的孤独数字是 [10, 8] 。
注意,也可以返回 [8, 10] 。
示例 2:
输入:nums = [1,3,5,3]
输出:[1,5]
解释:
- 1 是一个孤独数字,因为它只出现一次,并且 0 和 2 没有在 nums 中出现。
- 5 是一个孤独数字,因为它只出现一次,并且 4 和 6 没有在 nums 中出现。
- 3 不是一个孤独数字,因为它出现两次。
因此,nums 中的孤独数字是 [1, 5] 。
注意,也可以返回 [5, 1] 。
这一题,排序之后,我们在对其元素进行逐个遍历即可:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void quick_sort(int *a,int low,int high){
int l=low,h=high;
if(low<high){
int p=a[low];
while(low<high){
while(low<high&&a[high]>=p){
high--;
}
a[low]=a[high];
while(low<high&&a[low]<=p){
low++;
}
a[high]=a[low];
}
a[low]=p;
quick_sort(a,l,low-1);
quick_sort(a,low+1,h);
}
}
int* findLonely(int* nums, int numsSize, int* returnSize){
// for(int i=1;i<numsSize;i++){
// int t=nums[i];
// int j;
// for( j=i-1;j>=0;j--){
// if(nums[j]>t){
// nums[j+1]=nums[j];
// }
// else{
// nums[j+1]=t;
// break;
// }
// }
// if(j==-1){
// nums[0]=t;
// }
// }
if(numsSize==1){
*returnSize=1;
return nums;
}
quick_sort(nums,0,numsSize-1);
int p=0;
for(int i=0;i<numsSize;i++){
printf("%d ",nums[i]);
if(i==0){
if(nums[i+1]!=nums[i]+1&&nums[i+1]!=nums[i]-1&&nums[i+1]!=nums[i]){
nums[p++]=nums[i];
}
}
else if(i==numsSize-1){
if(nums[i-1]!=nums[i]+1&&nums[i-1]!=nums[i]-1&&nums[i-1]!=nums[i]){
nums[p++]=nums[i];
}
}
else{
if(nums[i-1]!=nums[i]+1&&nums[i-1]!=nums[i]-1&&nums[i+1]!=nums[i]+1&&nums[i+1]!=nums[i]-1&&nums[i]!=nums[i+1]&&nums[i]!=nums[i-1]){
nums[p++]=nums[i];
}
}
}
*returnSize=p;
return nums;
}