问题定义:有2n+1个数,只有一个单着,别的都是成对的,找出这个单着的数。比如:2 1 3 2 1。3是答案。

思路一:暴力搜索——每个数都和其他数比较,找不到相同的,就得到了结果。时间复杂度为o(n2)

思路二:排序搜索——先给序列排个序,之后从前往后一对一对的找,直到不是成对的为止。时间复杂度,怎么也得o(nlgn)

思路三:异或计算,一趟搞定。时间复杂度o(n)

直接看思路三:
原理:异或操作(^)——(对于操作)相同为0,相异为1.比如:1^0 = 1, 1 ^1=0

这样:

  • 两个相同的数异或就为0
  • 任何数和0异或为自己(转化到位。1^0 = 1, 0 ^0=0)

例如:5 ^ 5 = 0

      5 ^ 0 = 5

对于本题:2 1 3 2 1,都异或一下:相同的(2^2,1^1) 为0,剩下的3和0异或为自身3。(注:异或具有交换律)

参考代码:

#include <stdio.h>
int main()
{int a[5] = {2, 1, 3, 2, 1};int aim = a[0];for(i = 1; i < 5; i++){aim = aim ^ a[i];}printf("Result:", aim);return 0;
}

异或在这方面挺好,再来个应用:

不用第三个数直接交换两个数:

#include <stdio.h>
void swap(int *a, int *b)
{*a = *a ^ *b;*b = *a ^ *b;*a = *a ^ *b;
}
int main()
{int a=3, b=5;swap(&a, &b);printf("%d\n%d", a, b);return 0;
}

当然完成这个题目还可以用同样的思维:

#include <stdio.h>
void swap(int *a, int *b)
{*a = *a + *b;*b = *a - *b;*a = *a - *b;
}
int main()
{int a=3, b=5;swap(&a, &b);printf("%d\n%d", a, b);return 0;
}

本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/archive/2013/04/03/2998829.html,如需转载请自行联系原作者

找出2n+1个数中不成对的那个相关推荐

  1. 利用最小堆找出10亿个数中最大的10000个数

    最小堆 最小堆是一种完全二叉树,特点是根节点比两个子节点都小(或者根节点比子节点都大) 过程 先找10000个数构建最小堆 依次遍历10亿个数,如果比最小堆的最小值大,则替换这个最小值,并重新构建最小 ...

  2. Java面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素

    本文使用两种算法来实现,分别是二分查找法和插值查找法,发现插值查找法更好,更快地找到需要的数据. 代码如下: package com.moson.search;import java.util.Arr ...

  3. 已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者。

    已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者. 答案: int max(int a,int b) { return (a+b+abs(a-b))/2; } ...

  4. c语言:找出1到4000中,数字的各位数之和能被4整除的数有多少个?

    找出1到4000中,数字的各位数之和能被4整除的数,如:745:7+4+5=16,16可以被4整除:28:2+8=10,10不能被4整除:745就是这样的特殊数字,而28不是,求:这样的数字共有多少个 ...

  5. 程序员面试金典——解题总结: 9.18高难度题 18.5有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离

    #include <iostream> #include <stdio.h> #include <vector> #include <string> # ...

  6. 给出n个数,找出这n个数的最大,最小,和值

    Java给出n个数,找出这n个数的最大值,最小值,和. 输入格式 第一行为整数n,表示数的个数. 第二行有n个数,为给定的n个数,每个数的绝对值都小于10000. 输出格式 输出三行,每行一个整数.第 ...

  7. [Python3 练习] 010 找出藏在字符串中的“密码”

    题目:找出藏在字符串中的"密码" (1) 描述 1) 题源 1 Python Challenge, level 3 2) 题源 2 小甲鱼老师的 Python 课程,第 20 讲课 ...

  8. 数组两个整数相加 c语言,作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)...

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...

  9. 找出两个字符串中最大子字符串,如abractyeyt,dgdsaeactyey的最大子串为actyet

    // 最大子字符串.cpp : 定义控制台应用程序的入口点. // //找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的 ...

  10. 找出两个字符串中最长的相同子字符串

    //找出两个字符串中最长的相同子字符串public class Stringdemo {public static void main(String[] args) {String str1 = ne ...

最新文章

  1. LeetCode--023--合并K个排序链表
  2. Atom:A hackable text editor for the 21st Century
  3. 通过路由进行参数的传递(方法一)
  4. jvm是运行在操作系统之上的,他和硬件没有直接的交互
  5. java 变量作用域 c语言_C语言深入理解 - 常量与变量
  6. MRI骨水肿是早期未分化关节炎演变为RA的独立预测预测因素
  7. 使用Qt设计师文件的3种方式
  8. 什么浏览器好用_为什么国外的UC浏览器这么好用
  9. qt project settings被禁用解决方案
  10. 如何在div中垂直对齐图像
  11. 6-2 是否二叉搜索树 (25 分)
  12. 飞信2009_从飞信倒下的八个原因看运营商的复兴之路
  13. 虚拟机VMware安装windows7 64位操作系统(图文版详解版)
  14. MK808 vs Raspberry Pi
  15. 通过 homekit 打造智能家居
  16. 一键重装系统工具和U盘重装工具有什么区别?
  17. 油溶性InP/ZnS高亮绿光和红光PL490nm-750nm
  18. Unity 之 Ping类简析尝试使用
  19. 主机连wifi的情况下如何使虚拟机(Ubuntu)上网
  20. 小米路由器3/3G/4通过串口(ttl)刷机

热门文章

  1. Atitit.远程接口 监控与木马   常用的api 标准化v2 q216
  2. atitit.重装系统需要备份的资料总结 o84..
  3. atitit.提升开发效率---MDA 软件开发方式的革命(5)----列表查询建模
  4. paip.提升安全性---防止敏感文件被下载
  5. rust: linker-link-exe-not-found
  6. CTP: 为什么报网络原因发送失败,但连接却成功?
  7. python : sha256 、ripemd160
  8. 专访易建科技钟忻:基于开源,但不认同强于开源
  9. 【深度】中国半导体行业如何从芯片到生态整体突围?
  10. Linux宝库名人轶事栏目 | 感恩每一天