数组中数字出现的次数

题目一:数组中只出现一次的2个数字

一个整型数组里除了两个数字外,其他数字都出现了2次,清编写程序找出来这2个数字,要求时间复杂度为O(n),空间复杂度为O(1)。

思路:本题对时间复杂度要求,如果没有要求可以用以往的方法,先pop,然后在in判断,这里采用了位运算--异或。

1 先把数组中的每个元素异或,最后得到的是要找的2个数字的异或结果,因为相同数字异或结果为0

2 根据异或结果中的为1的位将数组中的数字分为2个类,他们每组只包含一个出现次数为1次的数

3 再将每个组异或就可以得到这2个数字了

class Solution:
    def xor(self,L):
        if L is None:
            return None
        
        result_xor = 0
        for i in L:       #数组异或得到result_xor
            result_xor = result_xor ^ i

        #找第一个1
        indexOf1 = self.find_first1(result_xor)
        n, m = 0, 0 
        for i in L:
            if self.IsBit(i, indexOf1):
                n = n ^ i
            else:
                m = m ^ i
        return n, m
        
    def IsBit(self, num, inde_bit):
        num = num >> inde_bit
        return num & 1

    def find_first1(self, result):
        index = 0
        while result & 1 == 0:
            
            result = result >> 1
            index += 1
        return index
    

            

题目2:数组中唯一出现一次的数字

在一个数组里除了一个数字出现一次之外,其他数字都出现了3次,请找出出现一次的数字

思路:把每个数字用二进制表示,然后将各位加起来,对应的位数能被3整除就可以,不能被3整除的就是最后要得到的数字

class Solution:
    def appear1(self, L):
        if L is None:
            return None
        bitSum = list(range(28*4))
        for i in L:
            bitMask = 1
            for j in range(28*4):
                bit = i & bitMask
                if bit != 0:
                    bitSum[111-j] += 1
                bitMask = bitMask << 1
        result = 0
        for i in range(112):
            result = result << 1
            result = bitSum[i]%3
        return result
            
    

在C语言中,有多种方法可以统计数组数字出现的次数,以下为两种常见的实现方式。 ### 方法一:先排序再统计 此方法先对数组进行排序,然后遍历排序后的数组,统计每个不同数字的出现次数。示例代码如下: ```c #include <stdio.h> // 简单的冒泡排序函数 void sort(int arr[], int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } int main() { int arr[] = { 1, 1, 1, 1 }; int i = 0, k = 0, flag = 1; int sz = sizeof(arr) / sizeof(arr[0]); int count[10][2]; sort(arr, sz); for (i = 0; i < sz; i++) { if (i == sz - 1 || arr[i] != arr[i + 1]) { count[k][0] = arr[i]; count[k][1] = flag; k++; flag = 1; } else { flag++; } } for (i = 0; i < k; i++) { printf("%d 出现了 %d 次\n", count[i][0], count[i][1]); } return 0; } ``` 在上述代码里,先定义了一个简单的冒泡排序函数`sort`,用于对数组进行排序。接着在`main`函数中,对数组排序后遍历数组,统计每个不同数字的出现次数,并将结果存于二维数组`count`中,最后输出每个数字及其出现次数。 ### 方法二:双重循环统计 该方法借助双重循环,对数组中的每个元素进行遍历,统计其出现的次数。示例代码如下: ```c #include <stdio.h> int main(void) { int data[50] = {0}, i, j, num = 0; // 向数组赋值 for (i = 0; i < 50; i++) { scanf("%d", &data[i]); if (data[i] == -1) { data[i] = 0; break; } } // 对数组元素进行重复次数统计 for (int n = 0; n < i; n++) { num = 0; for (int m = 0; m < i; m++) { if (data[n] == data[m]) { num++; } } // 避免重复输出 int isPrinted = 0; for (int p = 0; p < n; p++) { if (data[p] == data[n]) { isPrinted = 1; break; } } if (!isPrinted) { printf("%d 的出现次数是 %d\n", data[n], num); } } return 0; } ``` 在上述代码中,先通过`for`循环向数组赋值,以`-1`作为结束标志。然后利用双重循环,外层循环逐个锁定元素,内层循环对锁定的元素进行对比,统计其出现次数,最后输出每个数字及其出现次数,同时避免重复输出。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值