• 【C语言】找到数组中消失的数字(附赠冒泡排序,删除重复元素)


     这个原题需要

    Note: The returned array must be malloced, assume caller calls free().

    但是鉴于作者现在还不会malloc.......所以 ...... 教一个真正的C方法,真正的新手友好

    首先这个题目很复杂,但是我们注意到给定数组nums是乱序的!

    而且题目要求正常的数组应该是1~numsSize是连续的,顺序的

    自然想到先排序!而且很多数组题都可以先排序找找思路——>冒泡排序

    1. void bubble(int *nums,int n)
    2. {
    3. for (int i = 0; i < n-1; i++)
    4. {
    5. for (int j = 0; j < n - i - 1; j++)
    6. {
    7. if (nums[j] > nums[j + 1])
    8. {
    9. int a = nums[j];
    10. nums[j] = nums[j + 1];
    11. nums[j + 1] = a;
    12. }
    13. }
    14. }
    15. }

    排序之后,每一个元素都可能有不确定个数的重复

    如果把重复都去掉就好了

    比如把1,2,4,3,3,2——>1,2,3,4

    1. int delete(int* nums,int numsSize)
    2. {
    3. for (int i = 0; i < numsSize; i++)
    4. {
    5. for (int j = i+1; j < numsSize ; j++)
    6. {
    7. if (nums[i] == nums[j])
    8. {
    9. for (int l = j; l < numsSize - 1; l++)
    10. {
    11. nums[l] = nums[l + 1];
    12. }
    13. numsSize -= 1;
    14. j--;
    15. }
    16. }
    17. }
    18. return numsSize;
    19. }

    每重复一个数字 ,用第三层循环向前移动一个下标 

    相当于覆盖一个重复数字

    此时数组长度需要-1

    并且j-1,因为第二层循环的j要++,如果bu-1就会跳过一个元素

     

    正常来说是不需要返回值的,但是后续涉及到用数组返回消失的数字

    所以这里最好确定新数组(去重之后)元素个数,就是改变后的numsSize用int a接收

    所以1,2,4,3,3,2——冒泡——>1,2,2,3,3,4——去重——>1,2,3,4

    现在的nums数组和1,2,3,4,5,6就差下标为  a~原来numsSize   的数字,直接打印就行

    (因为不会malloc)

    注意!:原来numsSize要拿一个变量给固定住,不然就变化了


     打印

    由于只需要打印5 6两个数字,又恰好是下标为  a~原来numsSize   的数字

    直接打印即可

    1. void print(int a, int n, int* ret)
    2. {
    3. for (int i = a; i < n; ++i)
    4. {
    5. ret[i] = i + 1;
    6. printf("%d ", ret[i]);
    7. }
    8. }

    最终代码: 

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. //数组个数为numsSize 返回一个数组是原数组漏掉的元素
    4. void bubble(int *nums,int n)
    5. {
    6. for (int i = 0; i < n-1; i++)
    7. {
    8. for (int j = 0; j < n - i - 1; j++)
    9. {
    10. if (nums[j] > nums[j + 1])
    11. {
    12. int a = nums[j];
    13. nums[j] = nums[j + 1];
    14. nums[j + 1] = a;
    15. }
    16. }
    17. }
    18. }
    19. int delete(int* nums,int numsSize)
    20. {
    21. for (int i = 0; i < numsSize; i++)
    22. {
    23. for (int j = i+1; j < numsSize ; j++)
    24. {
    25. if (nums[i] == nums[j])
    26. {
    27. for (int l = j; l < numsSize - 1; l++)
    28. {
    29. nums[l] = nums[l + 1];
    30. }
    31. numsSize -= 1;
    32. j--;
    33. }
    34. }
    35. }
    36. return numsSize;
    37. }
    38. void print(int a, int n, int* ret)
    39. {
    40. for (int i = a; i < n; ++i)
    41. {
    42. ret[i] = i + 1;
    43. printf("%d ", ret[i]);
    44. }
    45. }
    46. int* findDisappearedNumbers(int* nums, int numsSize) {
    47. bubble(nums,numsSize);
    48. int n = numsSize;
    49. int ret[20];
    50. int a=delete(nums, numsSize); //4
    51. print(a, n,ret);
    52. return ret;
    53. }
    54. int main() //完全可以不写,但是可以自己测试用
    55. {
    56. int nums[] = { 4,2,2,3,3,1 };
    57. int numsSize = sizeof(nums) / sizeof(nums[0]);
    58. int *p=findDisappearedNumbers(nums, numsSize);
    59. }

    创作不易,感谢观看

     

  • 相关阅读:
    文件IO(系统IO)
    Centos7 安装gdal历程,使用node-gdal功能
    DDD进阶_领域设计的分层架构
    【vue2 vuex】store state mutations actions状态管理(草稿一留存)
    Fetch 请求不转换BLOB正常显示GBK编码的数据
    常见问题解答:同时运行 ELEMENTOR FREE 和 ELEMENTOR PRO 插件
    Linux重要知识点
    Python数据结构:列表(list)、元组(tuple)、字典(dict)
    Jeecgboot 字典值自动转化:DictAspect类方法改造,支持IPage、List、Object、Map类自动转化,附有源码
    XDOJ-267 判断栈输出顺序正确与否
  • 原文地址:https://blog.csdn.net/weixin_71138261/article/details/126512458