一个列表,找出只出现一次的元素

Posted 全栈测试笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个列表,找出只出现一次的元素相关的知识,希望对你有一定的参考价值。

C语言

 1 /*
 2 -----------------------------------
 3 动态分配需要的内存大小
 4 输入数组元素的值
 5 通过函数调用,传地址对数组排序
 6 循环每个元素,当循环比较某个值时,如果有相等的,计数加1,比较完成后,和cn比较,如果大于cn,那么说明找到,退出循环
 7 -----------------------------------
 8 */
 9 
10 # include <stdio.h>
11 # include <malloc.h>
12 
13 void findnum(int * arr, int n)
14 {
15     int i, j, count, cn;
16     count = 0;
17     cn = n/2;
18     
19     for (i=0; i<n; i++) //双重for循环,统计元素个数
20     {
21         for (j=0; j<n; j++)
22         {
23             if (arr[i] == arr[j])                
24                 count++;    
25         }                
26         
27         if (count > cn)
28         {
29             printf("超过长度一半的数字是:%d\\n", arr[i]);
30             break;        
31         }
32         else if (i==n-1)
33         {
34             printf("无超过长度一半的数字!\\n");
35             break;
36         }        
37         count = 0;        
38     }
39     return;
40 }
41 
42 int main(void)
43 {
44     int len, i;
45     int * pArr;
46     char ch;
47     
48     do {
49         
50         printf("请输入数字个数:");
51         scanf("%d", &len); //输入元素个数
52         printf("请输入%d个数字(以空格分隔):", len);
53         pArr = (int *)malloc(sizeof(int)*len); //动态分配内存
54         for (i=0; i<len; i++) //输入值
55             scanf("%d", &pArr[i]); 
56         printf("动态数组元素为:\\n");
57         for (i=0; i<len; i++) //输出值
58             printf("%d  ", pArr[i]);
59         printf("\\n");
60         
61         findnum(pArr, len); //调用查找函数
62         free(pArr); //释放动态分配的内存
63         
64         printf("\\n你想继续么(Y/N):"); //询问是否继续
65         flushall(); //清除缓存
66         scanf(" %c", &ch);
67         //printf("%c\\n", ch);
68         
69         
70     }while (\'y\'==ch || \'Y\'==ch); //如果输入的是Y或者y,表示继续
71     
72     return 0; 
73 }
74 
75 /*
76 在Vc++6.0中的输出结果为:
77 -----------------------------------
78 
79 请输入数字个数:5
80 请输入5个数字(以空格分隔):1 2 3 4 5
81 动态数组元素为:
82 1  2  3  4  5
83 无超过长度一半的数字!
84 你想继续么(Y/N):y
85 请输入数字个数:5
86 请输入5个数字(以空格分隔):1 1 1 2 3
87 动态数组元素为:
88 1  1  1  2  3
89 超过长度一半的数字是:1
90 你想继续么(Y/N):n
91 Press any key to continue
92 
93 -----------------------------------
94 */

 

Python

li = [1,2,3,4,5,2,2,2,2,2]
def findn(li):
    for i in li:
        if li.count(i)>len(li)/2:
            return i
n = findn(li)
print(n)

  

java:两种方法

 public static void main(String[] args) {
        int[] nums = {1,2,3,2,2,2,5,4,2};
        System.out.println(getFromSort(nums));
        System.out.println(getFromMap(nums));
    }

    public static int getFromSort(int[] array){
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));
        int mid = array.length/2;
        int midvalue = array[mid];
        int times = 0;
        for(int i=0;i<array.length;i++){
            if (array[i] == midvalue){
                times ++;
                if (times>mid){
                    return array[i];
                }
            }
        }
        return -1;
    }

    public static int getFromMap(int[] array){
        int mid = array.length/2;
        Map<String, Integer> map = new HashMap<>();
        for(int i=0;i<array.length;i++){
            String key = array[i] + "";
            if(map.get(key)==null){
                map.put(key,1);
            }else{
                map.put(key,map.get(key)+1);
            }

            if (map.get(key)>mid){
                return Integer.parseInt(key);
            }
        }
        return -1;
    }

 

以上是关于一个列表,找出只出现一次的元素的主要内容,如果未能解决你的问题,请参考以下文章

找出只出现一次的两个数字

位运算-异或运算-只出现一次的数字-给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素

一个数组中只有两个元素只出现一次,其他元素都出现两次,找出其中只出现一次的元素

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现偶数次。找出那个只出现了一次的元素。