数组中出现次数超过一半的数字 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

题目: 数组中有一个数字出现的次数超过数组长度的一半, 请找出这个数字.

1. 使用高速排序(QuickSort)的方法, 把中值(middle)和索引(index)匹配, 输出中值, 并检測是否符合要求.

2. 使用计数方法依次比較.

代码: 

方法1:

/*
* main.cpp
*
* Created on: 2014.6.12
* Author: Spike
*/ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h>
#include <stdlib.h> int RandomInRange(int min, int max)
{
int random = rand() % (max - min + 1) + min;
return random;
} void Swap(int* num1, int* num2)
{
int temp = *num1;
*num1 = *num2;
*num2 = temp;
} int Partition(int data[], int length, int start, int end)
{
if(data == NULL || length <= 0 || start < 0 || end >= length) {
return -1;
} int index = RandomInRange(start, end);
Swap(&data[index], &data[end]); int small = start - 1;
for(index = start; index < end; ++ index)
{
if(data[index] < data[end])
{
++ small;
if(small != index)
Swap(&data[index], &data[small]);
}
} ++ small;
Swap(&data[small], &data[end]); return small;
} bool CheckMoreThanHalf (int* numbers, int length, int number)
{
int times = 0;
for (int i=0; i<length; ++i) {
if (numbers[i] == number)
++times;
}
if (times*2 <= length) {
return false;
} return true;
} int MoreThanHalfNum(int* numbers, int length) {
if (numbers == NULL || length <= 0)
return 0; int middle = length >> 1;
int start = 0;
int end = length-1;
int index = Partition(numbers, length, start, end);
while (index != middle) {
if (index > middle) { //前面部分的数字多
end = index-1;
index = Partition(numbers, length, start, end);
} else {
start = index+1;
index = Partition(numbers, length, index+1, start);
}
} int result = numbers[middle];
if (!CheckMoreThanHalf(numbers, length, result))
return 0; return result;
} int main(void)
{
int str[] = {1, 2, 3, 4, 4, 4, 5, 4, 4};
int result = MoreThanHalfNum(str, 9);
printf("reuslt = %d\n", result); return 0;
}

方法2:

/*
* main.cpp
*
* Created on: 2014.6.12
* Author: Spike
*/ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h>
#include <stdlib.h> bool CheckMoreThanHalf (int* numbers, int length, int number) {
int times = 0;
for (int i=0; i<length; ++i) {
if (numbers[i] == number)
times++;
}
if (times*2 < length)
return false;
return true;
} int MoreThanHalfNum (int* numbers, int length) {
if (numbers == NULL || length <= 0)
return 0;
int result = numbers[0];
int times = 1;
for (int i=0; i<length; ++i) {
if (times == 0) {
result = numbers[i];
times = 1;
}
if (numbers[i] == result) times++;
else times--;
}
if (!CheckMoreThanHalf(numbers, length, result))
return 0;
return result;
} int main(void)
{
int str[] = {1, 2, 3, 2, 2, 2, 5, 2, 4};
int result = MoreThanHalfNum(str, 9);
printf("reuslt = %d\n", result); return 0;
}

输出:

reuslt = 4

编程算法 - 数组中出现次数超过一半的数字 代码(C)的更多相关文章

  1. [PHP] 算法-数组中出现次数超过一半的数字的PHP实现

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在 ...

  2. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

  3. 剑指Offer(二十八):数组中出现次数超过一半的数字

    剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  4. 九度OJ 1370 数组中出现次数超过一半的数字

    题目地址:http://ac.jobdu.com/problem.php?pid=1370 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2 ...

  5. 数组中出现次数超过一半的数字 -java

    数组中出现次数超过一半的数字 -java 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散列表的方式,也就是统计每个数组 ...

  6. 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字

    剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...

  7. 剑指Offer:数组中出现次数超过一半的数字【39】

    剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...

  8. php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中)

    php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中) 一.总结 1.if(isset($arr[$val])) $arr[$val]++; //1 ...

  9. 剑指 Offer 39. 数组中出现次数超过一半的数字

    剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [ ...

随机推荐

  1. Mac设置命令别名

    文件中添加 /Users/xxx/.bash_profile 添加别名命令: alias pull='git pull origin' 注意:等号后面不能有空格 从新读取配置文件: source ~/ ...

  2. 洛谷P3588 - [POI2015]Pustynia

    Portal Description 给定一个长度为\(n(n\leq10^5)\)的正整数序列\(\{a_n\}\),每个数都在\([1,10^9]\)范围内,告诉你其中\(s\)个数,并给出\(m ...

  3. You need to install the perl-doc package to use this program

    You need to install the perl-doc package to use this program 解决方案:apt-get install perl-doc

  4. 转:sudo 的常见用法和参数选项

    原文链接:http://wiki.ubuntu.org.cn/Sudo sudo,以其他用户身份执行一个命令. 用法 sudo -h | -K | -V sudo -v [-Akns] [-g gro ...

  5. cf615D Multipliers

    Ayrat has number n, represented as it's prime factorization pi of size m, i.e. n = p1·p2·...·pm. Ayr ...

  6. POJ3132 Sum of Different Primes

    Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3473   Accepted: 2154 Description A pos ...

  7. substring用法

    字符串截取,substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串. substring(int beginIndex, int endIndex) 返回一 ...

  8. 不拖控件的asp.net编程方法——第1回

    以前写的asp.net程序基本上都用了webfrom的控件编写的,当然有个好处就是易入门.快速效率高,但感觉自己这了几个小系统,还是没学到什么东西,感觉心里没底,因为都是封装好的东西,拿来就用的,功能 ...

  9. 数字IC设计入门必备——VIM自定义模板调用与VCS基本仿真操作示例

    一.前言 毕业论文答辩结束,闲下来写篇文章.芯片研发人员都在Linux系统下借助各种EDA工具和代码语言完成工作,因此提高代码开发效率,熟练运用开发工具是十分必要的.本文讲述VIM编辑神器的veril ...

  10. android EditText禁止复制粘贴完整代码

    <!-- 定义基础布局LinearLayout --> <LinearLayout xmlns:android="http://schemas.android.com/ap ...