首页 > 试题广场 >

数组中值出现了一次的数字

[编程题]数组中值出现了一次的数字
  • 热度指数:2279 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个数字arr,其中只有有两个数字出现了奇数次,其它数字都出现了偶数次,按照从小到大顺序输出这两个数。

输入描述:
输入包含两行,第一行一个整数n,代表数组arr的长度,第二行n个整数,代表数组arr,arr[i]为32位整数。


输出描述:
输出出现奇数次的两个数,按照从小到大的顺序。
示例1

输入

4
1 1 2 3

输出

2 3
示例2

输入

6
11 22 11 23 23 45

输出

22 45

备注:
时间复杂度,额外空间复杂度
import java.util.Scanner;
import java.util.Arrays;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] arr=new int[n];
        for(int i=0;i<n;i++){
            arr[i]=sc.nextInt();
        }
        Arrays.sort(arr);
        for(int i=0;i<n-1;){
            if(arr[i]!=arr[i+1]){
                System.out.print(arr[i]+" ");
                break;
            }
            i=i+2;
        }
        for(int i=n-1;i>1;){
            if(arr[i]!=arr[i-1]){
                System.out.print(arr[i]);
                break;
            }
            i=i-2;
        }
    }
}

发表于 2021-03-31 14:13:40 回复(0)
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        while (in.hasNext()){
            int n = in.nextInt();
            int[]num = new int[n];
            int[]num1 = new int[2];
            Map<Integer,Integer> map = new HashMap<>();
            for (int i = 0; i < n ; i++) {
                num[i] = in.nextInt();
            }
            for (int j = 0; j < n ; j++) {
                if(map.containsKey(num[j])){
                    map.put(num[j],map.get(num[j])+1);
                }else {
                    map.put(num[j],1);
                }
            }
            int k =0;
            for (Integer key:map.keySet()) {
                if(map.get(key)%2!=0){
                    num1[k] = key;
                    k++;
                }

            }
            Arrays.sort(num1);
            String a ="";
            a =num1[0]+" "+num1[1];
            System.out.println(a);

        }
    }
}

哈希表
发表于 2020-07-17 10:46:34 回复(0)
求助,代码通过率只有60%,大家帮忙改一改

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int  array[] = new int[n];
        for(int i = 0; i<n; i++){
            array[i] = sc.nextInt();
        }
        int ret = 0;
        for(int x:array){
            ret^=x;
        }
        int i = 0;
        for(;i<32;i++){
            if((ret&(1<<i))==1)
                break;
        }
        int a = 0; int b = 0;
        for(int x:array){
            if((x&(1<<i))==1){
                a^=x;
            }else{
                b^=x;
            }
        }
        if(a<b){
            System.out.println(a+" "+b);
        }else{
            System.out.println(b+" "+a);
        }
    }
}

发表于 2020-06-20 23:46:24 回复(1)
import java.util.*;

public class Main2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int[] arr = new int[n];
            for (int i = 0; i < n; i++) {
                arr[i] = sc.nextInt();
            }
            int retExclusive = 0;
            for (int i = 0; i <n ; i++) {
                retExclusive^=arr[i];
            }
            int index = findIndex(retExclusive);
            int num1 = 0;
            int num2 = 0;
            for (int i = 0; i <n ; i++) {
                if (judgeIndex(arr[i],index)){
                    num1^=arr[i];
                }else{
                    num2^=arr[i];
                }
            }
            if (num1<num2){
                System.out.println(num1+" "+num2);
            }else{
                System.out.println(num2+ " " + num1);
            }
        }
        }
        public static int findIndex(int num){
        //在整数num中找到最右边是1的位置
        int index = 0;
        while ((num&1)==0){
            num>>=1;
            index++;
        }
        return index;
        }
        public static boolean judgeIndex(int num,int index){
        //判断整数num右边第num位是否为1
        num>>=index;
        return ((num&1)==1);
        }
}

发表于 2020-06-11 15:04:46 回复(1)
import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
        //这块不是很懂,使用nextInt接收个数时,还未输入具体数字 nextLine后面的代码也会执行
            String s=sc.nextLine();
            String s1=sc.nextLine();
            String[]  ss=s1.split(" ");
            Map<String,Integer> mm=new HashMap<String,Integer>();
            for(int i=0;i<ss.length;i++){
                //偶数最终将不在map中
                if(mm.containsKey(ss[i])){
                    mm.remove(ss[i]);
                }else{
                    mm.put(ss[i],1);
                }
            }
            Set<Entry<String,Integer>>  es=mm.entrySet();
            int [] arr=new int[2];
            for(Map.Entry<String,Integer>  en:es){
                if(arr[0]==0){
                arr[0]=Integer.parseInt(en.getKey());
                }else{
                    arr[1]=Integer.parseInt(en.getKey());
                }
            }
                  if(arr[0]>arr[1]){
                    arr[0]=arr[0]^arr[1];
                     arr[1]=arr[0]^arr[1];
                      arr[0]=arr[0]^arr[1];
        }
       System.out.println(arr[0]+" "+arr[1]);
        }
  
    }
}


编辑于 2019-10-16 21:49:24 回复(0)

问题信息

上传者:小小
难度:
5条回答 5780浏览

热门推荐

通过挑战的用户

查看代码