数组中只出现一次的数字(快速排序)

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。

输入描述

题目保证输入的数组中只有两个数字出现一次
数据范围:
  对于%50的数据,size<=10^4
  对于%75的数据,size<=10^5
  对于%100的数据,size<=2*10^5


示例

输入

1,2,2,3,3,4,5,5,6,6,7,7,7

输出

1,4


思路

因为这一题的vector的size很大,以至于直接遍历寻找逆序对会超时,为了避免这种情况,我使用快速排序算法。快速排序算法,主要流程
第一步:我们将数组num[0]设置为哨兵x,然后从s=0,e=num.length()-1,如果s==e,跳出快排;
第二步:从e开始从后往前找到一个小于x的数num[e],将num[e]和num[s]交换
第三步:从s开始从前往后找到一个大于x的数num[s],将num[s]和num[e]交换
第四步:重复第二、三步,直到s==e,此时num被划分成两部分,num[0,s-1]都小于num[s],num[s+1,num.length() - 1]都大于num[s],但序列内不一定有序,故我们应该对num[0,s-1],num[s+1,num.length() - 1]递归的进行快排.


代码

#include "iostream"
#include "string"
#include "vector"
using namespace 

void Func(vector<int> &data, int l, int r)
{
    if (l >= r)
    {
        return;
    }
    int x = data[l], s = l, e = r, tmp;
    while (s != e)
    {
        while (s != e)
        {
            if (data[e] < x)
            {
                tmp = data[e];
                data[e] = data[s];
                data[s] = tmp;
                break;
            }
            e--;
        }
        while (s != e)
        {
            if (data[s] > x)
            {
                tmp = data[e];
                data[e] = data[s];
                data[s] = tmp;
                break;
            }
            s++;
        }
    }
    Func(data, l, s - 1);
    Func(data, s + 1, r);
}

void FindNumsAppearOnce(vector<int> data, int *num1, int *num2)
{
    Func(data, 0, data.size() - 1);
    bool find = false;
    for (int i = 0; i < data.size(); i++)
    {
        if (i == 0)
        {
            if (data[i] == data[i + 1])
            {
                continue;
            }
        }
        else if(i == data.size() - 1)
        {
            if (data[i] == data[i - 1])
            {
                continue;
            }
        }
        else if (data[i] == data[i + 1] || data[i] == data[i - 1])
        {
            continue;
        }

        if (!find)
        {
            *num1 = data[i];
            find = true;
        }
        else
        {
            *num2 = data[i];
            break;
        }
    }
    return;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 6,151评论 0 2
  • 在我的一生中,最开心的事情之一,便是与书与结缘。我时常感觉它们是我生命的一部分,读书让我更理性,也让我更感性。读书...
    HeartsFlying阅读 1,176评论 0 0
  • 耶路撒冷古城市不大,是座小山城,建在起伏的山丘上。走在城里的大街小巷里,放眼望去,建筑错落有致,很有层次感,没有见...
    张俊霞阅读 3,017评论 23 9
  • 教养可以弥补文化的缺陷,但文化却弥补不了教养的空白。 本来生活已经很不如意了, 应该宣传正能量 ,但实在忍不住想抱...
    策划师MrS徐阅读 3,255评论 0 0