一个数组中只有一个数是只有唯一一个,其他都是三个的,编写一个方法查找出那个唯一的值

 1 public class singleThree {
 2     /*
 3      * 如有数组A[]={2,2,3,2}
 4      * 其二进制为
 5      * 0 0 1 0 :2
 6      * 0 0 1 0 :2
 7      * 0 0 1 1 :3
 8      * 0 0 1 0 :2
 9      * 相加起来为
10      * 0 0 4 1 每一位除以3为
11      * 0 0 1 1 结果为3
12      * 当一个数和1进行与运算的时候只取最后一位
13      * 如0 0 1 1 & 0 0 0 1 结果为0 0 0 1
14      *
15      * 如上数组,应该先取数组各数据的最后一个二进制数相加
16      * 1.应该把最后一位数相加,第一次应该向右移动0位,相加后为1;
17      * result的结果为(w%3)<<(i-1)结果也是为1,从第0位得到的数据为整数,向左移动的位数
18      * 其实是计算二进制指定位数的数值,也就是从二进制转换为10进制
19      * 2.数组的各数据应计算第二位的二进制数,应该把数组的二进制数向右再移动一位,与1进行与运算得到结果为4
20      * result=(w%3)<<(i-1),为第二位二进制数的结果,应该和第一位的结果加起来
21      *
22      *
23      * */
24     public int find(int A[])
25     {
26         int bits = 4*8;
27                   int result=0;
28                   for(int i=1; i<=bits; i++)
29                  {
30                     int w=0;
31                     int t=1;
32
33                    for(int j=0; j<A.length; j++)
34                        w += (A[j]>>(i-1))&t;
35                result+= (w%3)<<(i-1);  //若是除过一个数之外,其他数重复k次,则将此处的3改为k
36                 }
37                  return result;
38             }
39
40
41     public static void main(String[] args) {
42         // TODO Auto-generated method stub
43         int A[]={2,2,3,2};
44         singleThree st = new singleThree();
45         int num=st.find(A);
46         System.out.println(num);
47
48     }
49
50 }
时间: 2024-08-14 07:38:34

一个数组中只有一个数是只有唯一一个,其他都是三个的,编写一个方法查找出那个唯一的值的相关文章

一个数组中只有俩个数出现了一次,其他都是成对出现的

#include <stdio.h> #include<stdlib.h> int find_one_bit(int num)    //约定寻找二进制中的某一位为1的位 { int bit = 0; while (num) { if (num & 1 == 1) return bit; bit++; num = num >> 1; } return -1; } void find_num(int arr[], int size, int *p1, int *p

一个数组中只有两个数是不同的,其他数字是成对出现的,下面代码可将该数组中不同的两数字找出并输出

#include<stdio.h>int main(){ void function(int * str, int size, int *p1, int *p2); int i = 0; int num1 = 0, num2 = 0; int arr[10] = {0}; int len = sizeof(arr) / sizeof(arr[0]); for (i = 0; i < len; i++) {  scanf("%d", &arr[i]); }  f

一个数组中找到满足和为sum的两个数

如果考虑hashmap直接O(n)的速度, 如果不行,就先排序,两头指针很好推理,关键是 a[beg] +a[end]>sum,意思就是说a[end]太大了,最小的数的都不满足,所以排除a[end] 绝知此事要躬行 #include<iostream>#include<algorithm>using namespace std; bool find(int *a,int sum,int len,int &ans1,int &ans2){    int *beg

定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数:然后按顺序每五个数求出一个平均值,放在另一个数组中并输出. var arr = []; var NewArr = []

判断一个数能否通过一个数组中的数相乘而得到(数组中的数使用次数不限)

题目:判断一个数能否通过一个数组中的数相乘而得到(数组中的数使用次数不限) 例如:第一行输入目标数x,第二行再输入一个数组(每个数用空格隔开),如果能则输出1,不能则输出-1: 输入例1: 20 2 3 5 7 输出: 1 解释:20 = 2*2*5,可以组成,所以输出1. 输入例2: 20 3 5 7 输出: -1 解释:无法组成,所以输出-1. 解题思路:转化成完全背包问题来解决(因为每个因子都可以使用无限次) #include <iostream> #include <bits/s

【学】从一个数组中找出重复最多的元素,并统计重复个数

通过json,将数组中的值都传给json中的键,利用json中的键是不能重复的性能,同时如果遇到重复的键,那就让这个键的值自增1,这样就能统计出重复次数 上面的方法可以得出一个json,但是还不够,因为无法比较json里的键或者值的大小,就要再将Json里的每组数据组成一个个小的json装到一个数组中,将统计的数量赋给每个json中的值,利用数组的sort的比较函数进行排序即可 function myMaxElement(arr){ var json = {}; for (var i=0; i<

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

1146: 零起点学算法53——数组中插入一个数

1146: 零起点学算法53--数组中插入一个数 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1749  Accepted: 613[Submit][Status][Web Board] Description 给定有序数组(从小到大),再给你一个数,要求插入该数到数组中并保持顺序 Input 多组测试,每组第一行输入一个整数n,然后是n个有序的整数 第二行输入1个整数m和1个整数K Outpu

在二维有序数组中搜索某个数(存在否、出现次数)

在二维有序数组中搜索某个数(存在否.出现次数) 问题描述 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复的整数. 样例 考虑下列矩阵: [ [1, 3, 5, 7], [2, 4, 7, 8], [3, 5, 9, 10] ] 给出target = 3,返回 2 实现思路 由于数组每行从左到右是有序的,每列从上到下是有序的,因此可以考虑从二维数组的右上角开始搜索.