• 单身狗1和单身狗2(C语言版)


    目录

    1. 单身狗1

    2. 单身狗2


    1. 单身狗1

    题目:

    一个数组中只有一个数字是出现一次其他所有数字都出现了两次。

    编写一个函数找出这一个只出现一次的数字。

    例如:有数组的元素是:1,2,3,4,5,1,2,3,4,6。只有5和6只出现1次,要找出5和6。

    第一种方法:暴力解题法(枚举法)

    这种方法就不细致讲解了,代码就能说明方法了

    1. #include
    2. #include
    3. //第一种方法:暴力解法
    4. //枚举法:直接用计数器的方式,找到该数字
    5. int find_single_dog1(int arr[], int sz) {
    6. int num = 0;//作为标记,记录每位元素出现的次数
    7. int* count = (int*)malloc(sz * sizeof(arr[0]));//记录每位元素出现的次数,然后存储起来
    8. for (int i = 0;i < sz;i++) {
    9. for (int j = 0;j < sz;j++) {
    10. if (arr[i] == arr[j])
    11. num++;
    12. }
    13. count[i] = num;
    14. num = 0;
    15. }
    16. for (int i = 0;i < sz;i++) {
    17. if (count[i] == 1)
    18. return arr[i];
    19. }
    20. return -1;
    21. }
    22. int main() {
    23. int a[] = { 1,2,3,4,5,1,2,3,4 };
    24. int n = find_single_dog1(a, 9);
    25. printf("%d", n);
    26. return 0;
    27. }

     第二种方法:用异或解题

    1. //第二种:用异或解题
    2. int find_single_dog1(int arr[], int sz) {
    3. int n = 0;
    4. for (int i = 0;i < sz;i++) {
    5. n ^= arr[i];
    6. }
    7. return n;
    8. }
    9. int main() {
    10. int a[] = { 1,2,3,4,5,1,2,3,4 };
    11. int n = find_single_dog1(a, 9);
    12. printf("%d", n);
    13. return 0;
    14. }

    2. 单身狗2

    题目:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

    编写一个函数找出这两个只出现一次的数字。 

    例如:有数组的元素是:1,2,3,4,5,1,2,3,4,6。只有5和6只出现1次,要找出5和6。

    第一种方法:暴力解题法(枚举法)

    这种方法就不细致讲解了,代码就能说明方法了

    1. //第一种方法:暴力求解法
    2. int* find_single_dog_first(int arr[], int sz) {
    3. int* find = (int*)malloc(sz * sizeof(arr[0]));//创建一个标识数组
    4. int* re = (int*)malloc(2 * sizeof(arr[0]));//创建一个返回数组
    5. int flag = -1;//自己也算一次,当只有自己,flag结果为0
    6. for (int i = 0;i < sz;i++) {
    7. for (int j = 0;j < sz;j++) {
    8. if (arr[i] == arr[j])
    9. flag++;
    10. }
    11. find[i] = flag;
    12. flag = -1;
    13. }
    14. int num = 0;//记录re的下标
    15. for (int i = 0;i < sz;i++) {
    16. if (find[i] == 0) {
    17. re[num] = arr[i];
    18. num++;
    19. }
    20. }
    21. return re;
    22. }
    23. int main() {
    24. int arr1[] = { 1,2,3,4,5,1,2,3,4,6};
    25. int sz = sizeof(arr1) / sizeof(arr1[0]);
    26. int* ret = find_single_dog_first(arr1, sz);
    27. for (int i = 0;i < 2;i++) {
    28. printf("%d ", ret[i]);
    29. }
    30. return 0;
    31. }

    第二种方法:用异或解题

     

    1. //第二种方法:用异或的思想解题
    2. //因为该题要返回两个int型的数据,但是函数返回只能返回一个数
    3. //所以传入指针ps1和指针ps2来让计算后的数据能传到主函数main
    4. void find_single_dog2(int arr[], int sz, int* ps1, int* ps2) {
    5. int r = 0;
    6. //1. 全部异或在一起,找出哪个位置为一
    7. for (int i = 0;i < sz;i++) {
    8. r ^= arr[i];
    9. }
    10. //2. 计算出哪个位置的数字1,用&运算符
    11. int pos = 0;//记录哪个位置为1
    12. for (int i = 0;i < 32;i++) {//因为r是int类型,有32位
    13. if (((r >> i) & 1) == 1) {
    14. pos = i;
    15. break;
    16. }
    17. }
    18. //3. 分组找出两个单身狗,并返回值
    19. for (int i = 0;i < sz;i++) {
    20. if (((arr[i] >> pos) & 1) == 1) {
    21. (*ps1) ^= arr[i];
    22. }
    23. else {
    24. (*ps2) ^= arr[i];
    25. }
    26. }
    27. }
    28. int main() {
    29. int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
    30. int sz = sizeof(arr) / sizeof(arr[0]);
    31. int ps1 = 0;
    32. int ps2 = 0;
    33. find_single_dog2(arr, sz, &ps1, &ps2);
    34. printf("两个单身狗分别为:%d 和 %d", ps1, ps2);
    35. return 0;
    36. }

     

  • 相关阅读:
    如何使用Matplotlib模块的text()函数给柱形图添加美丽的标签数据?
    青少年python系列 45.文件操作1
    奇葩需求记录 各个系统取数据联表展示
    [Centos]Docker卸载/安装&常用命令
    PyTorch深度学习实战——基于ResNet模型实现猫狗分类
    Stable diffusion的一些参数意义及常规设置
    在微信小程序中使用 echarts 图片-例 折线图
    linux 给根目录扩容(lvm CentOS 7.6 &kylinx86)
    Qt扫盲-QSqlRelationalTableModel 理论总结
    10个python爬虫入门实例
  • 原文地址:https://blog.csdn.net/ANNE_fly/article/details/133914036