编程算法 - 数组中出现次数超过一半的数字 代码(C)
数组中出现次数超过一半的数字 代码(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)的更多相关文章
- [PHP] 算法-数组中出现次数超过一半的数字的PHP实现
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在 ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
- 剑指Offer(二十八):数组中出现次数超过一半的数字
剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...
- 九度OJ 1370 数组中出现次数超过一半的数字
题目地址:http://ac.jobdu.com/problem.php?pid=1370 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2 ...
- 数组中出现次数超过一半的数字 -java
数组中出现次数超过一半的数字 -java 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散列表的方式,也就是统计每个数组 ...
- 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字
剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...
- 剑指Offer:数组中出现次数超过一半的数字【39】
剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...
- php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中)
php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中) 一.总结 1.if(isset($arr[$val])) $arr[$val]++; //1 ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [ ...
随机推荐
- jmeter历史版本下载
https://archive.apache.org/dist/jmeter/binaries/
- Django之model admin自定义后台管理
Admin管理界面是django的杀手级应用.它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即向网站中添加内容. 比如,数据表如下: from django.db ...
- Mysql 主外键与索引之间的区别和联系
系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部 ...
- Distimo发布新SDK 帮助开发者跟踪应用下载转换率
著名应用分析机构Distimo近日刚刚发布了新的SDK,可以帮助开发者更好地跟踪应用下载转换率,同时也可以帮助开发者更好地了解多个在线营销活动的表现. Distimo发布的新工具叫做“Distimo ...
- 性能学习之--loaderunner中run-time setting常用功能
先打开run-time setting界面 一.Run Logic 设置迭代次数,只控制action的迭代次数,init和end只执行一次. 如果迭代次数设置10,10个并发用户,那么init和e ...
- Spoj-TRNGL Make Triangle
Make Triangle Chayanika loves Mathematics. She is learning a new chapter geometry. While reading the ...
- [MFC] CFile读写文件实现(高效)
1.文件写入 void CMFCApplication1Dlg::Write() { CFile file; CString FileName = "D:\\100w.txt"; ...
- Android SurfaceView与View
SurfaceView介绍 SurfaceView是视图(View)的继承类,这个视图里面内嵌了一个专门用于绘制的Surface.你可以控制这个Surface的格式和尺寸,而SurfaceView控制 ...
- 标准C程序设计七---14
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- (8)C#连sqlserver
str="Data Source=ip; Network Library=DBMSSOCN; Initial Catalog=数据库; User ID=sa; Password=xx&quo ...