数字中所有数出现次数为k次,但有一个不为k次,求出这个数

思路: 1.建立辅助数组arr[32],统计数组中数的相应位上1的总和

2.如果要找的数在某个位i上不为0,则arr[i]对k取模肯定为0,否则表示要找的数在此位为1, s  +=  1<<i

代码如下:

int find(int *a, int len, int K)
{
    int arr[32] = {0};
    int i, j;
    for(i = 0; i < len; ++i)
        {
      unsiged int k = a[i];    -->负数右移补1,会出错,所以先变成unsigned int
       for(j = 0; j < 32; ++j)
        {
            arr[j] += ( (k >> j) & 1 );//这个用来求某个整数中1 的个数
        }
    }
    int result = 0;
    for(j = 0; j < 31; ++j)//计算数值
        {
            if(arr[j] %K != 0)
            result += (1 << j);
        }
   if(arr[31] % K != 0)//符号位
          result = 0 - result;
    return result;
}

-->相关题目变形:

1.一组数个数4K+2,有一个数只出现2次,其他的都出现4次,找出这个数     -->直接调用上面算法

2.一个数组中有2个数只出现一次,其他数都出现2次,找出这两个数:

1.对数组所以数异或,得到的结果是要找的2个数异或的结果

2.从异或的结果的数找到第一个位为1的位,则可知:要找的两个数,在这个位上,肯定一个为0,一个为1,

3.根据这个位将数组分为2组,一组此位都是0,一组此位都是1,然后在在两个分组内全部数异或,即可得到结果

时间: 2024-07-30 13:34:57

数字中所有数出现次数为k次,但有一个不为k次,求出这个数的相关文章

c编程:求出4&amp;#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

c编程:求出4&#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

统计字符串中出现次数最多的字母的次数,如果有多个重复的,都求出

package javastudy; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.TreeSet; public class Test1 { public static void main(String [] args){ String str = "aacdggdhrdhgsjrsovoiwimtcpiq"; new Test

用数组求一位数组中的最大值,最小值和平均分,并求出有多少个数超过平均分

#include<stdio.h> main() { int a=0,b,n,i,j,s[100],max,min,w; scanf("%d",&n); w=0; for(i=0;i<n;i++) scanf("%d",&s[i]); max=s[0]; for(i=1;i<n;i++) if(max<s[i]) max=s[i]; //else {max=s[i+1];min=s[i];}} min=s[0]; for

求从1到参数n中的各个数字中,各个位上1出现的次数和

/** * 求从1到参数n中的各个数字中,1出现的次数和 * * @param n * @return */ public static int countOne(int n) { int factor = 1; int cur; int low; int high; int cnt = 0; while ((n / factor) != 0) { low = n - (n / factor) * factor;// 低位数字 cur = (n / factor) % 10;// 当前位数字 h

Python解决 从1到n整数中1出现的次数

最近在看<剑指Offer>,面试题32的题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1.10.11和12,1一共出现了5次. 对于书中说的不考虑时间效率的解法很好理解,可以直接完成,但是对于书中介绍的另一种方法,没有理解,于是按照自己的思路进行了分析. 1位数,1-9中,1一共出现了1次: 2位数,10-99中,10-19的十位上一共出现了10*1=10次,对于每个十位开头的数字10-19.20-29,每个数个位上出现的

剑指Offer面试题32(java版):从1到n整数中1出现的次数

题目:输入一个整数n,求从1到n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11,和12,1一共出现了5次. 方法一:不考虑时间效率的解法,靠它拿到Offer有点难: 如果在面试的时候碰到这个问题,应聘者大多能想到最直观的方法,也就是累加1到n中每个整数1出现的次数.我们可疑每次通过对10求余数判断整数的个位数字是不是1.如果这个数字大于10,除以10之后再判断个位数字是不是1.基于这个思路,我们写出下面的代码: /** * 从1到n整数中1出现的

我的Java开发学习之旅------&gt;计算从1到N中1的出现次数的效率优化问题

有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数.比如f(1)=1:f(13)=6,问一个最大的能满足f(n)=n中的n是什么? 例如:f(13)=6, 因为1,10,11,12,13.正好是6个1. 解析:这题关键在效率上,在没有发现很科学.快速地计算出个数的情况下,可以采取缓存的机制.因为就2000000来说,计算时间就已经无法忍受了,因此,可以把以前的计算结果缓存起来,把每次的结果保存好,就不用每次都重新计算,从而可提高效率. 例如:计算101,只需要把1~10

题目1373:整数中1出现的次数(从1到n整数中1出现的次数)

题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数. 输入: 输入有多组数据,每组测试数据为一行. 每一行有两个整数a,b(