`

找出出现次数超过一半的数字

 
阅读更多

hl同学问我一道这个题,想了一种方法,感觉还是不错的,只扫描一次,贴一下伪代码:

int more_than_half(int a[],int n){
	stack<int> st;
  	for(int i = 1; i < n; i++){
  		if(st.empty()){
      			st.push(a[i]);
  		}else{
      			if(a[i] != st.top()){
       				st.pop();
      			}else{
				st.push(a[i]);
      			}
  		}
	}
	return st.top();
}

 思想是不同的数相互抵消,最终剩的数就是超过一半的。

按照这种思想,计数的方法来实现:

int more_than_half(int a[],int n){
	int count,i;
	int res;
	for(i = count = 0; i < n; i++){
		if(count == 0){
			res = a[i];
			count = 1;
		}else{
			if(res == a[i])
				count++;
			else
				count--;
		}
	}
	return res;
}
0
0
分享到:
评论
2 楼 fuliang 2010-05-29  
D04540214 写道

运行java代码时候,传进 int[] a = new int[] {1, 2, 1, 2, 1, 2,4}; 最 后 答 案 是 4.

这样的相互抵消好像不妥当

前提是有超过一半的数存在,才能找到。
1 楼 D04540214 2010-05-29  

运行java代码时候,传进 int[] a = new int[] {1, 2, 1, 2, 1, 2,4}; 最 后 答 案 是 4.

这样的相互抵消好像不妥当

相关推荐

    Python 找出出现次数超过数组长度一半的元素实例

    本示例主要关注如何找出一个数组中出现次数超过数组长度一半的元素。这个需求可能出现在寻找多数元素或者解决“多数投票”类的问题中。 首先,我们有两个不同的解决方案,分别称为“普遍性解法”和“特殊性解法”。...

    php实现数组中出现次数超过一半的数字的统计方法

    这种问题的难点在于,如何在一次遍历数组的情况下找出这个出现次数超过一半的数字。最直观的方法是使用一个辅助数组来记录每个数字出现的次数,但这会消耗额外的空间,增加时间复杂度。 考虑到时间复杂度和空间...

    PHP实现找出数组中出现次数超过数组长度一半的数字算法示例

    在本问题中,需要统计数组中每个数字的出现次数,并进行判断,以确定是否有某个数字的出现次数超过数组长度的一半。为了实现这一点,本示例中使用了一个临时数组(`$temp`)来存储原数组的副本。这允许我们多次检查...

    基于Java代码实现数字在数组中出现次数超过一半

    在编程领域,有时我们需要找出数组中出现次数超过一半的数字。这个任务在Java中可以通过多种方法来实现。以下就是四种不同的方法,每种方法都有其独特的思路和效率。 方法一:数组排序 一种常见的方法是先对数组...

    python--Counter()统计列表中超过一半的数字(csdn)————程序.pdf

    在本例中,我们学习了如何使用`Counter`找出列表中出现次数超过一半的数字,这是通过创建`Counter`对象,调用`most_common()`或`keys()`和`get()`方法实现的。掌握这一技巧有助于提升数据分析的效率。

    剑指Offer(Python多种思路实现):数组中出现次数超过一半的数字

    在编程面试中,"数组中出现次数超过一半的数字" 是一个常见的问题,它考察了对数据结构和算法的理解。本题目的目标是找到数组中出现次数超过数组长度一半的元素,如果没有这样的元素,则返回0。以下是几种不同的...

    Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例

    本示例探讨了如何使用Python `collections` 模块中的 `Counter` 类来找出序列中出现次数最多的元素。`Counter` 是一个非常实用的工具,它以字典的形式存储元素及其出现的次数,从而方便我们对数据进行统计分析。 ...

    南华大学算法分析与设计实验

    实验内容:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。例如,输入:[1, 2, 3, 2, 2, 2, 5, 4, 2],输出:2。 实验设计(问题解决...

    寻找一堆数字中的主元素

    主元素是指在给定的一组数字中出现次数超过数组长度一半的元素。如果存在这样的元素,那么它就是数组的主元素。在标题"寻找一堆数字中的主元素"中,我们探讨的问题是如何在一组数字中有效地找到这个关键的元素。 ...

    算法经典面试题

    这是摩尔投票法的应用,用于找出数组中出现次数超过一半的元素。通过不断地将成对的不同元素剔除,最后剩下的元素即为目标元素。 7. **排序大量小整数**: 题目中给出了内存限制和数字范围。可以使用位操作来解决...

    统计数字算法解答

    在给定的C++程序中,我们可能是在寻找一个数组或序列中的特定统计量,比如出现次数最多的数字(众数)、最大值或最小值等。 C++是一种强大的系统级编程语言,支持面向对象编程,同时它的性能优秀,特别适合实现复杂...

    《算法最优解(第一版)》剑指Offer题解校招求职刷题必备.docx

    1. **超过一半的数字**:这个问题要求找出数组中出现次数超过一半的元素,可以采用摩尔投票法,通过两两抵消的方式快速找到多数元素。 2. **调整数组顺序**:将数组中的奇数移动到偶数前面,同时保持它们之间的相对...

    算法设计技巧与分析寻找多数元素

    在算法设计领域,寻找多数元素是一项重要的任务,它要求我们从一个给定的序列中找出出现次数超过序列长度一半的元素。这个问题具有广泛的应用,比如数据挖掘、数据分析以及投票统计等场景。本压缩包文件包含了关于这...

    Java面试 Java超级经典100问题 Java高级开发工程师必备 Java面试宝典

    Java面试 Java超级经典100问题 Java高级开发工程师必备 Java面试宝典 ...数组中出现次数超过一半的数字.30.找出最小的K个数31.连续子数组的最大和.32.从1到整数n中1出现的次数.33.把数组中的数排成一个最小的数.3

    剑指offer(牛客网)

    27. 数组中出现次数超过一半的数字:找出一个数组中出现次数超过一半的数字。 28. 最小的K个数:从数组中找出最小的k个数。 29. 连续子数组的最大和:找出连续子数组的最大和。 30. 把数组排成最小的数:将数组中...

    《剑指Offer》题目及代码.zip

    29. 数组中出现次数超过一半的数字 30. 找出最小的K个数 31. 连续子数组的最大和 32. 从1到整数n中1出现的次数 33. 把数组中的数排成一个最小的数 34. 求第N个丑数 35. 第一个出现一次的字符 36. 数组中...

    算法题总结 2741

    11. **和为 s 的两个数字**:经典的哈希表应用,通过哈希表记录每个数字出现的次数,快速找到和为s的两个数。 12. **和为 s 的连续正数序列**:涉及滑动窗口的概念,找到和为s的最长连续正数序列。 13. **数组中...

Global site tag (gtag.js) - Google Analytics