加强版水王:找出出现次数刚好是一半的数字

我们知道,水王问题:有N个数,其中有一个数出现超过一半,要求在线性时间求出这个数。那么,我的问题是,加强版水王:有N个数,其中有一个数刚好出现一半次数,要求在线性时间内求出这个数。

因为,很明显,如果是刚好出现一半的话,如此例: 0,1,2,1 :

方案一:

根据上面的例子,最后我们可能会输出不是符合条件的数字,那么仔细分析的话,占一半的数字,只能在两个变量中出现:candidate和arr[n-1]。如果arr[n-1]不是占一半的数据key,那么candidate最后保持着key,另一种情况,就是arr[n-1]为key。我们遍历到最后,再遍历一趟判断一下是否arr[n-1]占据一半即可。

改进:

我们再遍历的过程中,让每一个数据与arr[n-1]比较,统计和arr[n-1]相同的数据,那么到最后就不用再遍历了,代码如下:

int MoreThanHalf(int a[], int N)
{
    int sum1 = 0;//最后一个元素的个数
    int sum2 = 0;
    int candidate;
    int i;
    for(i=0;i<N-1;i++)//扫描前N-1个元素
    {
        if(a == a[N-1])//判断当前元素与最后一个是否相等
        sum1++;
        if(sum2 == 0)
        {
             candidate = a;
             sum2++;
        }
        else
        {
             if(a == candidate)
                 sum2++;
             else
                 sum2--;
        }
     }  

     if((sum1+1) == N/2)
         return a[N-1];
     else
         return candidate;
} 

 

时间: 2024-10-24 17:12:45

加强版水王:找出出现次数刚好是一半的数字的相关文章

MySQL中用通用查询日志找出查询次数最多的语句的教程_Mysql

MySQL开启通用查询日志general log mysql打开general log之后,所有的查询语句都可以在general log文件中以可读的方式得到,但是这样general log文件会非常大,所以默认都是关闭的.有的时候为了查错等原因,还是需要暂时打开general log的(本次测试只修改在内存中的参数值,不设置参数文件). general_log支持动态修改: mysql> select version(); +-----------+ | version() | +------

linux-Linux中怎么用grep找出一个文件中空白行的行数字=

问题描述 Linux中怎么用grep找出一个文件中空白行的行数字= 不知道为什么这样写# grep '^&' /etc/profile | wc -l找不出结果, 请问这个应该怎么写才是真确的? 解决方案 grep -E '^$' -n /etc/profile 解决方案二: 加上正则的参数,试试下面的命令 grep -e '^$' -n /etc/profile

JavaScript实现找出数组中最长的连续数字序列_javascript技巧

原始题目: 给定一个无序的整数序列, 找最长的连续数字序列. 例如: 给定[100, 4, 200, 1, 3, 2], 最长的连续数字序列是[1, 2, 3, 4]. 小菜给出的解法: function maxSequence(array,step){ var _array = array.slice(), //clone array _step = 1, _arrayTemp = [], i = 0; var parseLogic = { //result container parseRe

利用mysql general log日志找出查询次数最多的SQL句子

查询最多的sql语句 开启general log   mysql> show  variables like '%general%'; +------------------+-------------------------------------+ | Variable_name | Value | +------------------+-------------------------------------+ | general_log | OFF | | general_log_fi

c语言 设计一个找出同数值部分排列的程序

问题描述 c语言 设计一个找出同数值部分排列的程序 定义一行的整数的输入有相同连续的地方为"同数值部分排列"找出有最长的同数值部分排列,并输出排列长度及这个数字的程序.最长的同数值部分排列有两个以上的时候,输出最后那个.输入的数字用空格或者换行区别 例1输入:0 1 1 1 2 0 0输出:3 1 例2输入:1 1 1 31 2 223输出:3 2 解决方案 #include <stdio.h>int main(){ int x; int c = 0; int px = -

数组大小为2n+1-数组相关算法java,找出需求的数据

问题描述 数组相关算法java,找出需求的数据 存在一个数组,数组大小为2n+2,里面有n对个数,例如:1,2,2,3,4,1.(数组是无序的,考虑排序的话一定会超过限制)这,6个数中的单独的数就是3,4,要你用你能想到的最高效率的方法找出来 解决方案 如果数组是连续的则可以用byte[] b = new byte[n+1];然后遍历一遍原数组,将遍历的值放入b的下标中计数,最后为1的那个下标表示数据是单独的. 这样的话总最多做3n+3次操作就能找全单独的数. 如果数组里面的数是无规律的,那么可

[华为机试练习题]61.找出字符串中第一个出现次数最多的字符

题目 描述: 找出字符串中第一个出现次数最多的字符 详细描述: 接口说明 原型: bool FindChar(char* pInputString, char* pChar); 输入参数: char* pInputString:字符串 输出参数(指针指向的内存区域保证有效): char* pChar:出现次数最多的字符 返回值: false 异常失败 true 输出成功 练习阶段: 初级 代码 /*--------------------------------------- * 日期:2015

找出给定字符串中出现最多的字符和次数

  "给定一个字符串,找出这个字符串中出现最多的字符和次数",笔试碰到的一个问题,还是比较简单的,贴出来与大家分享. public class CharCount { public static void Charcount(String string) { if (string == null) return; int[] count = new int[string.length()]; for (int i = 0; i < count.length; i++) { //

《Python Cookbook(第3版)中文版》——1.12 找出序列中出现次数最多的元素

1.12 找出序列中出现次数最多的元素 1.12.1 问题 我们有一个元素序列,想知道在序列中出现次数最多的元素是什么. 1.12.2 解决方案 collections模块中的Counter类正是为此类问题所设计的.它甚至有一个非常方便的most_common()方法可以直接告诉我们答案. 为了说明用法,假设有一个列表,列表中是一系列的单词,我们想找出哪些单词出现的最为频繁.下面是我们的做法: words = [ 'look', 'into', 'my', 'eyes', 'look', 'in