题目描述:有2n+1个数,其中有n对数字是成双出现的,有且仅有1个数字只有它自己一个。请你找出这个孤单数。

输入描述:

第一行有且只有一个正整数n(n<=500000)

第二行有2n+1个数ai(-10^9<=ai<=10^9)

输出描述:

有且只有一个数,输出这个孤单数。

样本输入:

3
6 2 6 3 7 7 3

样本输出:

2

 分析:
解法一:
  乍一看这个题目,其实就类似于我们小时候玩过的一个纸牌游戏:抽乌龟。也就是说,有奇数张牌,只有一种牌有且只有一张,我们需要找的也就是这张“孤单牌”。那么很明显,不是“孤单数”的数字,必然有另一个和它相等的数字存在,因此,我就想到了一种方法,排序。没错,就是排序,我们只需要把这奇数张牌从小到大排序或者从大到小排序即可,当然,为方便起见,我们就从小到大排序,那么不是孤单数的数字的前面或者后面一个必定和它相等,因为有奇数个数字,那么必然存在最后一张才是孤单数的情况,因此,我想到了分类寻找,也就是先在前2n个数字中寻找孤单数,找不到时,最后一个数字必然是孤单数。接下来,代码就很容易实现了。
代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
int a[500001];
using namespace std;
int main(void)
{
int i,m,num,last,n,flag = 0;
scanf ("%d",&n);
for (i = 0; i < 2 * n + 1; i++)
{
scanf ("%d",&a[i]);
}
sort(a, a + 2 * n + 1);
num = 0;
m = a[0];
for (i = 0; i < 2 * n;i++)//先在前2n个数字中寻找孤单数
{
if(a[i] == m)
{
num++;//每个不是孤单数的数字必定有两个
if(num == 2)//当同一种数字有两个时,证明该数字不是要寻找的数字,于是从下一种数字开始寻找
{
num = 0;//下一种数字数量清零
m = a[i + 1];//将中间变量的值定义为下一种数字
}
}
else//当一种数字第一次出现的数字的后一个数字与其不相等时,证明该数字是孤单数
{
flag = 1;//将标记赋值为1
last = a[i - 1];//孤单数为上一个数字
break;//退出循环
}
}
if(!flag)//当标记为0,也就是没有在前2n个数字中找到孤单数时,证明最后一个数字为孤单数
{
last = a[i];
}
printf ("%d\n",last);//输出孤单数

return 0;

}

小结:从这到题目可以看到排序的巧妙使用,这道类似于寻找单身狗的题目可以利用排序,找到单身狗,同时,标记也发挥了很大的作用~~

解法2:

上面这种我第一个想到的算法并不是最优的算法,因为开了一个很大的数组,也十分地占用内存。其实这道题最优的算法应该是用逻辑符号异或,因为0与任何数的异或都是这个数本身,而两个相同的数字的异或又等于0,在本题中,那2n个不是单身狗的数字的异或一定等于0,因此,这2n+1个数字的异或必定等于那个单身狗。不论是从时间还是空间上,算法都比第一种要好得多,时间复杂度也有原来的O(2n)减少成了O(n)。

代码:

#include <stdio.h>
int main(void)
{
int a,n,i,num = 0;
scanf ("%d",&n);
for (i = 0; i < 2 * n + 1; i++)
{
scanf ("%d",&a);
num ^= a;
}
printf ("%d\n",num);

return 0;
}

 

OJ2236“孤单数”题目报告的更多相关文章

  1. 【九度OJ】题目1074:对称平方数 解题报告

    [九度OJ]题目1074:对称平方数 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1074 题目描述: 打印所有不超过n( ...

  2. 【九度OJ】题目1183:守形数 解题报告

    [九度OJ]题目1183:守形数 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1183 题目描述: 守形数是这样一种整数, ...

  3. 【剑指Offer】孩子们的游戏(圆圈中最后剩下的数) 解题报告(Python)

    [剑指Offer]孩子们的游戏(圆圈中最后剩下的数) 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-in ...

  4. 【剑指Offer】丑数 解题报告

    [剑指Offer]丑数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: ...

  5. 【剑指Offer】把数组排成最小的数 解题报告(Python)

    [剑指Offer]把数组排成最小的数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  6. 比赛--找丢失的数--解题报告T

    找丢失的数 题目大意: There is a permutation without two numbers in it, and now you know what numbers the perm ...

  7. 「SDOI2014」数数 解题报告

    「SDOI2014」数数 题目描述 我们称一个正整数 \(N\) 是幸运数,当且仅当它的十进制表示中不包含数字串集合 \(S\) 中任意一个元素作为其子串. 例如当 \(S=(\)22, 333, 0 ...

  8. 洛谷 P1430 序列取数 解题报告

    P1430 序列取数 题目描述 给定一个长为\(n\)的整数序列\((n<=1000)\),由\(A\)和\(B\)轮流取数(\(A\)先取).每个人可从序列的左端或右端取若干个数(至少一个), ...

  9. 洛谷 P2022 有趣的数 解题报告

    P2022 有趣的数 题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,9. 定义K在N个数中的 ...

随机推荐

  1. JAVA 编程规范

       软件开发技术规范 PTHINK-DEVELOP-JAVA-091010         Java语言编程规范   2009-10-10发布                2009-10-11实施 ...

  2. 张小龙的野心:用小程序重构web|小程序好处及可能的不足

    一:张小龙的野心:用小程序重构web 一 很多年以前,张小龙写了一款软件:Foxmail. 这款软件当年有数百万用户,这是一个相当庞大的量,因为彼时网民也只有千万当量级的规模. 我是一个非常忠实的用户 ...

  3. Python yield用法

    yield 官方称是一种生成器,每每遇到这样包含这个关键字的代码,往往有些难读.def testyield(count): for x in xrange(count): print "te ...

  4. 开涛spring3(6.7) - AOP 之 6.7 通知顺序

    如果我们有多个通知想要在同一连接点执行,那执行顺序如何确定呢?Spring AOP使用AspectJ的优先级规则来确定通知执行顺序.总共有两种情况:同一切面中通知执行顺序.不同切面中的通知执行顺序. ...

  5. Swift 入门之简单语法(五)

    面向对象 目标 构造函数 构造函数的基本概念 构造函数的执行顺序 KVC 在构造函数中的使用及原理 便利构造函数 析构函数 区分 重载 和 重写 懒加载 只读属性(计算型属性) 设置模型数据(didS ...

  6. JVM学习笔记三:垃圾收集器与内存分配策略

    内存回收与分配重点关注的是堆内存和方法区内存(程序计数器占用小,虚拟机栈和本地方法栈随线程有相同的生命周期). 一.判断对象是否存活? 1. 引用计数算法 优势:实现简单,效率高. 致命缺陷:无法解决 ...

  7. Heartbeat高可用解决方案

    Heartbeat高可用 Heartbeat作用: 通过heartbeat,可以将资源(ip以及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务 ...

  8. unittest模块的常用方法:

    unittest模块的常用方法: assertEqual(a, b)     a == b assertNotEqual(a, b)     a != b assertTrue(x)     bool ...

  9. HashSet集合

    HashSet特点 1.无序,不允许重复(无序指元素顺序与添加顺序不一致,每次遍历出来的位置不是恒久不变的) 2.HashSet通过调用hashCode()和equals方法来剔除重复 3.HashS ...

  10. 抓包工具 - HttpWatch

    HttpWatch是功能强大的网页数据分析工具,集成在IE工具栏,主要功能有网页摘要.cookies管理.缓存管理.消息头发送/接收,字符查询.POST数据.目录管理功能和报告输出.HttpWatch ...