长度为n的数组,有一个数重复出现了n/2+1次,找出(三种方法)
问题:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h> int fun(int inp[],int size)
{
assert(inp!=NULL && size>);
int i=,j=;
for(;i<size-;i++){
int sum = ;
for(j=i+;j<size;j++){
if(inp[i]==inp[j]) sum++;
}
if(size/+ == sum) return inp[i];
}
return -;
} int main(){
int input[]={,,,,,,,,,};
int ret = fun(input,);
printf("result = %d\n",ret);
return ;
}
结果如下:
[root@admin Desktop]# ./a.out
result =
[root@admin Desktop]#
#include <stdlib.h>
#include <stdio.h>
#include <assert.h> int fun(int inp[],int size)
{
assert(inp != NULL && size>);
int i=,j=;
for(;i<size-;i++){//外循环,保证每个数都被遍历到
printf("i==:%d\n",i);
if(- == inp[i]) continue;//外循环遇到-1时,证明该数被选中并剔除过
else{
printf("in else ==:\n");
for(j=i+;j<size;j++){ //内循环,从i往后寻找与inp[i]不同的且不为-1的元素;
if(inp[i] != inp[j] && - != inp[j]){
printf("j==:%d\n",j);
inp[i]=inp[j]=-;//找到后都置为-1
break;
}
if(size- == j) return inp[i];//如果j走到头都没找到,证明剩下的都与inp[i]重复
}
}
}
return -;//失败,返回-1
} int main()
{
int input[] = {,,,,,,,,,};
int ret = fun(input,);
printf("the number is:%d\n",ret);
return ;
}
结果:
[root@admin Desktop]# ./a.out
i==:
in else ==:
j==:
i==:
i==:
in else ==:
j==:
i==:
i==:
in else ==:
j==:
i==:
i==:
in else ==:
j==:
i==:
i==:
in else ==:
the number is:
[root@admin Desktop]#
1.若当前数的值与候选人candidate一样,则把候选人的票数加1;
2.若当前数与候选人不一样,则把它的票数减1,如果减掉后票数小于0,则把候选人踢掉,用当前数作为新的候选人;
3.最后剩下的候选人就是出现次数超过一半的数。
算法的正确性证明: 数组中,数值相同的数都会投赞成票,数值不同的都会投反对票,有一个数出现的次数超过一半,其它数得到的反对票必然大于一半,所以其它数中,任何一个得票都会小于0,遭到淘汰。剩下来的只能是超过一半的那个数。
#include <stdlib.h>
#include <stdio.h>
#include <assert.h> int fun(int inp[],int size)
{
assert(inp != NULL && size>);
int i=,candidate=inp[],vote=;
for(;i<size;i++){
printf("i = %d; candidate is:%d; vote=%d\n",i,candidate,vote);
if(inp[i] == candidate) vote++;
else{
vote--;
if(vote < ){
candidate = inp[i];
vote = ;
}
}
}
return candidate;
} int main()
{
int input[] = {,,,,,,,,,};
int ret = fun(input,);
printf("the number is:%d\n",ret);
return ;
}
结果:
[root@admin Desktop]# ./a.out
i = ; candidate is:; vote=
i = ; candidate is:; vote=
i = ; candidate is:; vote=
i = ; candidate is:; vote=
i = ; candidate is:; vote=
i = ; candidate is:; vote=
i = ; candidate is:; vote=
i = ; candidate is:; vote=
i = ; candidate is:; vote=
i = ; candidate is:; vote=
the number is:
[root@admin Desktop]#
长度为n的数组,有一个数重复出现了n/2+1次,找出(三种方法)的更多相关文章
- (PASS)JAVA数组去重 三种方法 (不用集合)
第一种方法(只学到数组的看): 定义一个新的数组长度和旧数组的长度一样,存储除去重复数据的旧数组的数据和0, package demo01; import java.sql.Array; import ...
- 数组k平移三种方法(java)
上代码,本文用了三种方法实现,时间复杂度不一样,空间复杂度都是o(1): public class ArrayKMove { /** * 问题:数组的向左k平移,k小于数组长度 * @param ar ...
- js二维数组定义和初始化的三种方法总结
js二维数组定义和初始化的三种方法总结 方法一:直接定义并且初始化,这种遇到数量少的情况可以用var _TheArray = [["0-1","0-2"],[& ...
- php将数组写入到文件的三种方法
php将数组原样写入或保存到文件有三种方法可以实现, 第一种方法是使用serialize, 第二种方法是使用print_r, 第三种方法是使用var_export, 本文章向大家介绍这三种方法是如何将 ...
- php数组合并有哪三种方法
php数组合并有哪三种方法 一.总结 一句话总结:array_merge():array_merge_recursive():‘+'号 $a = array('color'=>'red',5,6 ...
- 输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5511707.html 昨天晚上,有个朋友找到我,他在用matlab编程,但是遇到一个问题,解决不了. 问题如下: ...
- 0..n去掉一个数,给你剩下的数,找出去掉的那个数
转载请注明转自blog.csdn.net/souldak , 微博@evagle 首先,考虑没有去掉那些数,如果n是奇数,n+1个最低位肯定是0101...01,count(0)=count(1),如 ...
- python3的leetcode题,两个数求和等于目标值,返回这两个数的索引组成的列表(三种方法)
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为gai目标值的 两个 整数. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 ...
- 前端面试题1:Object.prototype.toString.call() 、instanceof 以及 Array.isArray()三种方法判别数组的优劣和区别
1. Object.prototype.toString.call() 每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object ...
随机推荐
- 勾选Create git respository的作用
在Xcode中创建项目时会弹出Source Control选项,勾选Create git repository选项可以帮助我们对照以前项目中代码中修改的部分,为开发提供方便. 在项目完成到一定程度时, ...
- 调试经验--硬盘U菜
调试经验--硬盘U菜 随着嵌入式设备功能的开发,随着对存储设备的需求:需要存储大量数据信息.需要在转储数据,U盘升级功能等. 在使用存储设备的过程中,我们遇到一些问题,也总结了些经验: 1.几 ...
- jquery插件分类与编写详细讲解
jquery插件分类与编写详细讲解 1. 插件种类 插件其实就是对现有的方法(或者叫函数)做一个封装,方便重用提高开发效率. jQeury主要有2种类型 1)实例对象方法插件 开发能让所有的j ...
- navicat连接oracle一个错误:ORA-12737 Instant Client Light:unsupported server character set ZHS16GBK
今天使用Navicat连接Oracle数据库.它报告了以下错误:"ORA-12737 Instant Client Light:unsupported server character se ...
- oracle 创建用户,授权用户,创建表,查询表
原文:oracle 创建用户,授权用户,创建表,查询表 oracle 创建用户,授权用户,创建表,查询表 假设oracle10g所有的都已经安装和配置好 第一步:win+R,进入运行,cmd; 第二步 ...
- SQL点滴34—SQL中的大小写
原文:SQL点滴34-SQL中的大小写 默认情况下,SQL Server不区分大小写,如果数据表TEST的TNAME列中有数据“abcd”和“Abcd”, 如果使用查询语句:select * from ...
- Perl基础(1)chop与chomp的区别
chop是去掉字符串的最后一个字符 chomp是去掉"$/"指定的结尾符号 测试程序一: [perl] #!/bin/perl $tmp = "sincere" ...
- Linux下防火墙设置
Linux下开启/关闭防火墙命令 1) 永久性生效,重启后不会复原 开启:chkconfigiptables on 关闭:chkconfigiptables off 2) 即时生效,重启后复原 开启 ...
- 点击按钮,通过JS代码实现复制INPUT表单,表格:
获取表单: <SCRIPT LANGUAGE="JavaScript"> function copyinput() { var input=document.getEl ...
- avalon.js实现一个简易日历
使用MVVM框架avalon.js实现一个简易日历 最近在做公司内部的运营管理系统,因为与日历密切相关,同时无需触发条件直接显示在页面上,所以针对这样的功能场景,我就用avalon快速实现了一个简 ...