codility刷题 04 OddOccurrencesInArray

一、问题

/**

  • @description:给出了一个由N个整数组成的非空数组A。该数组包含奇数个元素,并且该数组的每个元素都可以与另一个具有相同值的元素配对,除了一个未配对的元素。
  • 例如,在数组A中这样:
  • A [0] = 9 A [1] = 3 A [2] = 9
  • A [3] = 3 A [4] = 9 A [5] = 7
  • A [6] = 9
  • 索引0和2处的元素的值为9,
  • 索引1和3的元素的值为3,
  • 索引4和6的元素的值为9,
  • 索引5处的元素的值为7,并且未配对。
  • 编写一个函数:
  • 类Solution {public int solution(int [] A); }
  • 给定一个由满足上述条件的N个整数组成的数组A,则返回未配对元素的值。
  • 例如,给定数组A使得:
  • A [0] = 9 A [1] = 3 A [2] = 9
  • A [3] = 3 A [4] = 9 A [5] = 7
  • A [6] = 9
  • 该函数应返回7,如上面示例中所述。
  • 针对以下假设编写有效的算法:
  • N是[1…1,000,000]范围内的奇数整数;
  • 数组A的每个元素都是[ 1 … 1,000,000,000 ] 范围内的整数;
  • A中除一个值以外的所有值都出现偶数次

二、思路

1) 创建一个 int[] 数字作为 位图 初始全是0 配对之后,对应的两个位置上的值改成1
2)最后位图里面剩下的唯一一个 0 就是需要的位置,定位到下标输出对应的值

三、代码实现

public class Solution {
    public int solution(int[] A) {

        // write your code in Java SE 8
        //创建一个位图 初始全是0 配对之后,改成1
        int[] bytePic=new int[A.length];
        for(int i=0;i<A.length;i++){
            for(int j=i+1;j<A.length;j++){
                //如果已经被匹配过,就跳过
                if(bytePic[i]==1){
                    continue;
                }else {
                    if (A[i]==A[j]){
                        //设置位图
                        bytePic[i]=1;
                        bytePic[j]=1;
                        //第一次找到就退出本次循环
                        break;
                    }
                }
            }

        }

        //找到位图中仅存的 0
        int index=-1;
        for (int i=0;i<bytePic.length;i++){
            if (bytePic[i]==0){
                index=i;
            }
        }
        return A[index];
    }

}

Test 类

public class Test {
    public static void main(String[] args) {
        Solution solution=new Solution();
        int[] array=new int[]{9,3,9,3,9,7,9};
        System.out.println(solution.solution(array));
    }
}

四、测试结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值