//找到数组中,出现了奇数次的数并打印

本文介绍如何使用Java实现两个题目:一是查找数组中仅出现奇数次的数,通过异或操作消除偶数次出现的元素;二是处理两种数各出现奇数次的情况,通过异或和位运算找出特定的唯一数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package Find;

/**
 * @author 真他喵的学不动咯
 * @create 2022-08-20--15:07
 */
public class fin {   //找到数组中,出现了奇数次的数并打印

    //不需要排序,直接异或,因为异或的结果和顺序无关
    //目标需要寻找的也是次数,异或出来的就是剩下的那一个


    //题目1:
    //arr中,只有一种数出现奇数次
    //偶数次的,异或出来都是0;最后只剩奇数次的那一次
    public static void printOddTimesNum1(int[] arr){
        int eor=0;
        for (int i=0;i<arr.length;i++){
            eor^=arr[i];   //eor=eor^arr[i],eor会随着i一直把数组中的数向后遍历,直到把数组中所有的数都遍历完
            System.out.println(eor);
        }
    }

    //题目2:
    //arr中,只有两种数出现奇数次
    //偶数次的,异或出来都是0;
    public static void printOddTimesNum2(int[] arr){
        /*
        偶数次仍然不干扰,剩下的奇数次只有a,b
         */
        int ero=0;
        for (int i=0;i<arr.length;i++){
            ero^=arr[i];  //找到了a、b
        }
        //此时的ero中必然有一个位置是1
        //010101110
        //000000010  rightOne
        int rightOne=ero&(~ero+1); //提取出最右边的1
        int onlyOne=0;  //onlyOne  ero'
        for (int i=0;i<arr.length;i++){
            //     arr[1]=00001110101
            //   rightOne=00000010000
            if ((arr[i]&rightOne)!=0){   //代表010100010处有1  ,把最右位是0还是1分开
                onlyOne^=arr[i];
            }
        }
        System.out.println(onlyOne+" "+(ero^onlyOne));  //onlyOne是a,ero^onlyOne是b
    }
}

首先,我们可以定义一个一维数组并初始化30个整,然后遍历数组找到所有奇数并将它们存储到另一个数组中。接着,我们再从这个奇数数组中找出次小的奇数。最后,我们将原始数组按照每3个元素一行的方式打印出来。 以下是用C语言完成这个任务的示例代码: ```c #include <stdio.h> #include <stdlib.h> #define ARRAY_SIZE 30 // 定义一个来查找次小的奇数 int findSecondSmallestOdd(int *numbers, int count) { int odd_numbers[ARRAY_SIZE / 2]; // 存储奇数的临时数组 int i = 0, j = 0; for (i = 0; i < count; i++) { if (numbers[i] % 2 != 0) { // 检查是否为奇数 odd_numbers[j++] = numbers[i]; } } if (j == 0 || odd_numbers[j - 1] >= odd_numbers[j]) { // 如果奇数不足2个或者都是非负 return -1; // 返回-1表示找不到次小的奇数 } else { return odd_numbers[j - 1]; // 找到次小的奇数 } } void printArrayInRows(int arr[], int size) { for (int i = 0; i <= size; i += 3) { for (int j = i; j < i + 3 && j < size; j++) { printf("%d ", arr[j]); } printf("\n"); } } int main() { int arr[ARRAY_SIZE] = { ... }; // 初始化30个整 int second_smallest_odd = findSecondSmallestOdd(arr, ARRAY_SIZE); if (second_smallest_odd != -1) { printf("次小的奇数是:%d\n", second_smallest_odd); } else { printf("没有找到次小的奇数。\n"); } printArrayInRows(arr, ARRAY_SIZE); // 输出数组,每3个元素一行 return 0; } ``` 在这个代码中,你需要自己填充`arr[]`数组的初始值。找到次小奇数的部分依赖于实际的输入据,如果不存在满足条件的奇数,`findSecondSmallestOdd`函会返回-1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值