小米OJ 2. 找出单独出现的数字

解法一:

map

1.45 ms

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;

int main()
{
    int temp;
    map<int, int> mapping;
    while (scanf("%d", &temp) != EOF)
    {
        mapping[temp]++;
    }
    for (map<int, int>::iterator it = mapping.begin(); it != mapping.end(); it++)
    {
        if (it->second == 1)
        {
            printf("%d", it->first);
        }
    }
    system("pause");
    return 0;
}

解法二:

因为题目提出“其中仅有一个数字出现过一次,其他数字均出现过两次”,即可以利用异或计算

一个数字异或它自己结果为0,异或0结果为它自己即a^a=0,a^0=a,且异或满足a^b^c=a^(b^c)。

因此我们可以设置一个ret异或每个元素,最后相同的都抵消为0,那个唯一的数字异或0为它自己即为答案。

1.97 ms

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;

int main()
{
    int temp;
    int arr[21];
    int i = 0;
    while (scanf("%d", &temp) != EOF)
    {
        arr[i] = temp;
        i++;
    }
    int ret = 0;
    for (int j = 0; j < i; j++)
    {
        ret ^= arr[j];
    }
    printf("%d",ret);
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/ruoh3kou/p/10013174.html

时间: 2024-10-05 05:50:20

小米OJ 2. 找出单独出现的数字的相关文章

【小米oj】 找出单独出现的数字

1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int n,x; 6 map<int,int>mp; 7 int main() 8 { 9 while(~scanf("%d",&x)){ 10 mp[x]++; 11 } 12 for(auto i:mp){ 13 if(i.second==1)printf("%d\n",i.first); 14 } 15 return

小米OJ 12. 找出可能的合的组合

利用dfs解决,从给出的数组左边或右边开始遍历,对每一个数字进行判断,有三种情况: 1. 加上当前数字的值,遍历下一个数字 2. 加上当前数字的值,继续遍历该数字 3. 不加上当前的数字的值,遍历下一个数字 约束条件为: 超出数组等 var sum = 0; var nums; function solution(line) { var str = line.split(" "); nums = str[0].split(","); var num = parseI

【小米oj】 找出旋转有序数列的中间值

1 #define mm(a) memset(a,0,sizeof(a)); 2 #define max(x,y) (x)>(y)?(x):(y) 3 #define min(x,y) (x)<(y)?(x):(y) 4 #define Fopen freopen("1.in","r",stdin); freopen("m.out","w",stdout); 5 #define rep(i,a,b) for(int

LeetCode:Consecutive Numbers - 找出连续出现的数字

1.题目名称 Consecutive Numbers(找出连续出现的数字) 2.题目地址 https://leetcode.com/problems/consecutive-numbers/ 3.题目内容 写一个SQL,查出表Logs中连续出现至少3次的数字: +----+-----+ | Id | Num | +----+-----+ | 1  |  1  | | 2  |  1  | | 3  |  1  | | 4  |  2  | | 5  |  1  | | 6  |  2  | | 

剑指Offer36 数组所有数字出现两次,只有两个出现了一次,找出这两个数字

1 /************************************************************************* 2 > File Name: 38_NumbersAppearOnce.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月03日 星期六 10时50分32秒 6 *******************************

C语言实现一个int类型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个数字

题目是这样叙述的:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字. 要求:时间复杂度为O(N),空间复杂度为O(1). 请看我的分析:将这道题简单化:一个数组中只有一个数字出现一次,其他数字都是成对出现的,这时我们可以根据异或运算符的特性:A^B^A = B; 0 ^ A = A:我们可以将这个数组的全部元素依次做异或运算,最终结果就是那个只出现一次的数字.不会的可看本人(2019-04-04)那天的博客 如果这个数组中出现两个不同的数字,而其他数字均出现两次

一组成对的数字,找出不成对的数字

题面描述 有一个卡组,卡组中所有不同的卡牌都有两张.不小心遗失了一张,找出遗失的是哪张卡牌. 输入数据 输入数据的第一行为一个整数 T(1 <= T <= 10) ,表示有 T 组测试数据.每组数据的第一行为一个整数 n(2 <= n <=100000) , n 为偶数,表示一个卡组中卡牌的数量.接下来的一行有 n - 1 个整数,为剩余牌的编号,其中相同牌的编号相同,不同牌的编号不同. 输出数据 对于每组数据,在单独的一行中输出结果,为滑落牌的编号,格式见样例. 样例输入 221

九度OJ 1035找出直系亲属

题目描述:     如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A,B是C的(外)曾祖父,曾祖母,则A,B是C的great-grandparent,C是A,B的great-grandchild,之后再多一辈,则在关系上加一个great-. 输入:     输入包含多组测试用例,每组用例首先包含2个整数n(0<=n<=26)和m(0<m<50)

signal num一个int数组,里面数值都是成对出现,只有一个是单独的,找出单独者。360ms

public class Solution { public int singleNumber(int[] nums) { int ret = nums[0]; for (int i = 1; i < nums.length; i++) { ret ^= nums[i]; } return ret; } }