求一个数组中只有一个和两个数字出现了一次,其余成对出现

//一个数字出现一次
#include<iostream>
using namespace std;
int once(int* a, int num)
{
 int ret = 0;
 for (int i = 0; i < num; ++i)
 {
  ret ^= a[i];
 }
 return ret;
}
int main()
{
 int array[5] = { 1, 2, 2, 3, 3 };
 int sum = once(array, 5);
 cout << sum << endl;
 return 0;
}

//两个出现一次
#include <iostream>
using namespace std;
int TWO(int num)
{
 int get = 0;
 while (num)
 {
  if (num % 2 == 1)//返回二进制中出现的第一个一的位数
  {
   return get;
  }
  get++;
  num /= 2;
 }
 return -1;
}
void find(int*a, int ret, int *p, int *q)
{
 int find = 0;
 int pos = 0;
 for (int i = 0; i < ret; ++i)
 {
  find ^= a[i];
 }
 pos = TWO(find);
 for (int i = 0; i < ret; ++i)
 {
  if (1 & (a[i] >> pos))
  {
   *p ^= a[i];
  }
  else
  {
   *q ^= a[i];
  }
 }
}
int main()
{
 int a[8] = { 1, 1, 2, 5, 3, 3, 4, 5 };
 int ret = sizeof(a) / sizeof(a[0]);
 int num1 = 0;
 int num2 = 0;
 find(a, ret, &num1, &num2);
 cout << num1 << "," << num2 << endl;
 return 0;
}
时间: 2024-11-04 19:41:59

求一个数组中只有一个和两个数字出现了一次,其余成对出现的相关文章

求一个数组中只出现一次的数字

/* 求一个数组中只出现一次的数字(注:只针对数组中有两个数不同,且其他数字两两相同) 题目:一个整型数组里除了两个数字出现一次外,其他的数字都出现了两次:求出现一次的数字: 如:数组a[]={2,4,3,6,3,2,5,5};执行程序后应输出4和6:因为4,6只在该数组中出现了一次 思路:两个数字相同其异或结果一定为0,先异或->再分组-->再对每个子序列异或 算法: 1. 先对数组的每一个元素进行异或操作,求结果(本质就是对那两个不同的数的异或,即4^6=0010) 2.根据异或的操作结果

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

#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

求一维数组中不重叠的两个子数组的最大和

给定一个长度为N的整数数组a,求不重叠的两个子数组的和的最大值. 如a[6]={1, 2, -4, 3, 2, -5}.所取的子数组分别为{1,2}{3, 2}时,两个子数组的和最大,为3+5=8. 这个题目是数组的子数组最大和(即最大连续和)的变形(后面附上了求解子数组最大和的程序). 一种方法是把数组分成两部分([0~i]和[i+1~len-1]),分别求两部分的最大连续和相加,再从中选出最大的.时间复杂度是O(N*N).这种方法在求解最大连续和时会有冗余的计算,需要优化. 第二种方法申请两

js中的冒泡排序以及实现一个数组中得最到最大的数字小例

这其实是一个很简单的js就可以实现,当然一般情况就是利用for循环,从第一个跟第二个开始比较,根据大小交互位置,思路很简单. 也就是js中的冒泡排序 冒泡排序 时间复杂度为O(n^2),有两个优点: 1.“编程复杂度”很低,很容易写出代码: 2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序.快速排序均不具有稳定性. 实现基本思路:冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数

面试题1:找出一个数组中三个只出现一次的数字

version1: 找出一个数组中一个只出现一次的数字,其他数字都出现两次:将所有数字异或,得到的结果即为只出现一次的. version2: 找出一个数组中两个只出现一次的数字,其他数字都出现两次:将所有数字异或,得到的结果即为x=a^b, index为x中第一个为1的位,则a 和b中第index为必然有一个为1,有一个为0.据此将所有数据分为两组,一组的第index为都为1,另一组第index为都为0,第一组数字异或得到a,第二组数字异或得到b. 时间复杂度为o(n),空间复杂度为o(1).

程序员面试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).这个算法很简

求一个数组中最大连续子序列的和

10.求一个数组中最大连续子序列的和 参考链接:http://blog.csdn.net/butwang/article/details/4691974 思路:如果已经知道在前0~k-1共k个元素中,在最大和为MaxAll[k-1], 怎么求0~k共k+1个元素的MaxAll[k]. 如果前k个元素的最大和子序列包括a[k-1],则很容易知道MaxAll[k] = max(MaxAll[k-1] + a[k], a[k]).那如果前k个元素的最大和子序列不包括a[k-1]呢?在数组后面增加一个元

C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和、部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的

/* 第七章函数的基本知识 */ /*01)c++对于返回值有一定的限制:可以是常量.变量.指针.结构对象或表达式,但不可以是数组02)c++返回数组的方法:将数组作为结构会对象组成部分来返回03)函数遇到return则结束该函数04)如果一个函数的两房额参数类型相同,则必须分别制定每个参数的类型,而不能像声明常规变量那样,将声明组合在一起05)*/ //本代码注意double类型的写法以及double和int类型数据的转换 1 #include <iostream> 2 3 void che

【C语言】在两个数成对出现的数组中找到一个单独的数。

//在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) { int i = 0; int ret = 0; for (i = 0; i < len; i++) { ret = ret^arr[i]; } return ret; } int main() { int arr1[] = { 1, 2, 2, 3, 1, 5, 3 }; int arr2[] =