如何找出c 数组 重复 次数中重复次数最多的数

Js查找字符串中出现次数最多的字符及个数实例解析
作者:鬼畜十三
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Js查找字符串中出现次数最多的字符及个数 ,本文分为传统写法和正则写法两种方法给大家介绍了js查找字符串出现次数最多的字符及个数,非常不错,感兴趣的朋友参考下吧
如sssfgtdfssddfsssfssss,出现最多的字符是s,出现了12次
1.准备一个空的json,通过循环字符串的每个字符来看,如果json里没有这个字符,就在json里创建一个新的数组,并把这个字符放进数组里,如果json里有这个字符,继续把字符添加进数组里,这时循环完json里有n个数组
2.找出json里长度最长的数组,此时长度即个数,而最多的字符就是这个参数,用到for...in...循环和参数attr
var str="sssfgtdfssddfsssfssss";
function max(){
var json={};
var num=0;
var value=
for(var i=0;i&str.i++){
var k=str[i];
if(!json[k]){
json[k]=[];
json[k].push(k); //这里不需要else,否则只有存在这个字符时才添加。次数会少一次
for(var attr in json){
if(num&json[attr].length){
num=json[attr].
value=json[attr][0];
alert("出现最多的字符是:"+value+',出现次数是:'+num);
如果不想往json里放东西怎么做呢?
1.准备一个空的json,通过循环字符串的每个字符来看,如果json里没有这个字符,就把这个字符的数目设为1,如果有则数目++
2.循环json里的字符,只要存在,就把他的数目赋给一个变量,并且每次都比较新的字符数量和这个变量的大小,如果比变量大,则更新变量的值,最后这个变量的值就是最多字符的数目
而最多的字符就是json里这个字符
var str="sssfgtdfssddfsssfssss";
function max(){
var json={};
for(var i=0;i&str.i++){
var k=str[i]; //k是所有字符,字符串也跟数组一样可以通过中括号下标方法取到每个子元素
if(json[k]){
json[k]++; //json里有这个字符时,把这个字符的数量+1,
json[k]=1; //否则把这个字符的数量设为1
var num=0;
var value=
for(var k in json){ //s、f、g、t、d
if(json[k]&num){
num=json[k];
alert("出现最多的字符是:"+value+',出现次数是:'+num);
正则的方法
1.字符串转为数组进行排序,以便正则选出相同的挨在一起的字符
2.通过正则replace()方法的两个参数,来匹配出现最多的字符和数量
var str="sssfgtdfssddfsssfssss";
var num=0;
var value=
function max(){
var new_str=str.split("").sort().join("");
var re=/(\w)\1+/g; //没有\1,re就是一整个排好序的字符串,有了\1就是出现过的有重复的取出来,\1表示跟前面第一个子项是相同的
new_str.replace(re,function($0,$1){ //$0代表取出来重复的一个个整体,如[s,s...],[f,f..],[d,d....] $1代表这个整体里的字符
if(num&$0.length){
alert(value+":"+num)
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具/**数组中元素重复最多的数
* @param array
* @author shaobn
* @param array
public static void getMethod_4(int[] array){
Map&Integer, Integer& map = new HashMap&&();
int count = 0;
int count_2 = 0;
int temp = 0;
for(int i=0;i&array.i=i+count){
if(i==array.length-1){
for(int j=i+1;j&array.j++){
if(array[i]==array[j]){
if(count&count_2){
map.put(count_2, array[i]);
System.out.println(map.get(count_2));
}int[] array = {1,1,1,5,5,8,9}
阅读(...) 评论()程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】
时间: 15:59:41
&&&& 阅读:299
&&&& 评论:
&&&& 收藏:0
标签:转!http://blog.csdn.net/dabusideqiang/article/details/
11、求旋转数组的最小数字
题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。
分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。
我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子数组的元素。我们还可以注意到最小的元素刚好是这两个子数组的分界线。我们试着用二元查找法的思路在寻找这个最小的元素。
首先我们用两个指针,分别指向数组的第一个元素和最后一个元素。按照题目旋转的规则,第一个元素应该是大于或者等于最后一个元素的(这其实不完全对,还有特例。后面再讨论特例)。
接着我们得到处在数组中间的元素。如果该中间元素位于前面的递增子数组,那么它应该大于或者等于第一个指针指向的元素。此时数组中最小的元素应该位于该中间元素的后面。我们可以把第一指针指向该中间元素,这样可以缩小寻找的范围。同样,如果中间元素位于后面的递增子数组,那么它应该小于或者等于第二个指针指向的元素。此时该数组中最小的元素应该位于该中间元素的前面。我们可以把第二个指针指向该中间元素,这样同样可以缩小寻找的范围。我们接着再用更新之后的两个指针,去得到和比较新的中间元素,循环下去。
按照上述的思路,我们的第一个指针总是指向前面递增数组的元素,而第二个指针总是指向后面递增数组的元素。最后第一个指针将指向前面子数组的最后一个元素,而第二个指针会指向后面子数组的第一个元素。也就是它们最终会指向两个相邻的元素,而第二个指针指向的刚好是最小的元素。这就是循环结束的条件。
1、前面提到在旋转数组中,由于是把递增排序数组前面的若干数字搬到数组的后面,因此第一个数字总是大于或等于最后一个数字,但有个特例:把排序数组前面的0个元素搬到后面,即数组没有改变,还是原来的排序数组。此时,数组中第一个数字就是最小数字。
2、当两个指针指向的数字和中间数字相同时,无法判断中间的数字式位于前面的子数组中还是后面的子数组中,则上面的方法就失效了。此时,则使用顺序查找方法。
bool&glo_InvalidInput=&&
int&MinInOrder(int*&numbers,&int&index1,&int&index2);&&
int&Min(int*&numbers,&int&length)&&
&&&&if(numbers&==&NULL&||&length&&=&0)&&
&&&&&&&&glo_InvalidInput=&&
&&&&&&&&return&-1;&&
&&&&int&index1&=&0;&&
&&&&int&index2&=&length&-&1;&&
&&&&int&indexMid&=&index1;&&
&&&&while(numbers[index1]&&=&numbers[index2])&&
&&&&&&&&if(index2&-&index1&==&1)&&
&&&&&&&&{&&
&&&&&&&&&&&&indexMid&=&index2;&&
&&&&&&&&&&&&&&
&&&&&&&&}&&
&&&&&&&&indexMid&=&(index1&+&index2)&/&2;&&
&&&&&&&&if(numbers[index1]&==&numbers[index2]&&&&numbers[indexMid]&==&numbers[index1])&&
&&&&&&&&&&&&return&MinInOrder(numbers,&index1,&index2);&&
&&&&&&&&if(numbers[indexMid]&&=&numbers[index1])&&
&&&&&&&&&&&&index1&=&indexM&&
&&&&&&&&else&if(numbers[indexMid]&&=&numbers[index2])&&
&&&&&&&&&&&&index2&=&indexM&&
&&&&return&numbers[indexMid];&&
int&MinInOrder(int*&numbers,&int&index1,&int&index2)&&
&&&&int&result&=&numbers[index1];&&
&&&&for(int&i&=&index1&+&1;&i&&=&index2;&++i)&&
&&&&&&&&if(result&&&numbers[i])&&
&&&&&&&&&&&&result&=&numbers[i];&&
&&&&return&&&
12、在旋转数组中查找指定的数(无重复元素)
题目:在旋转数组中查找指定的数,找到返回下标,否则返回-1
分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}
我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,可以试着用二元查找法的思路在寻找指定的元素。
int&SearchRotatedArray(int&a[],&int&n,&int&value)&&
&&&&if(a==NULL&||&n&&=0)&&
&&&&&&&&return&-1;&&
&&&&int&begin=0,&end=n-1;&&
&&&&while(begin!=end)&&
&&&&&&&&int&mid=(begin+end)/2;&&
&&&&&&&&if(value&==&a[mid])&&
&&&&&&&&&&&&return&&&
&&&&&&&&if(a[begin]&&&a[mid])&&
&&&&&&&&{&&
&&&&&&&&&&&&if(a[begin]&&=&value&&&&value&&&a[mid])&&
&&&&&&&&&&&&&&&&end=&&
&&&&&&&&&&&&else&&
&&&&&&&&&&&&&&&&begin=&&
&&&&&&&&}&&
&&&&&&&&else&&
&&&&&&&&{&&
&&&&&&&&&&&&if(a[mid]&&&value&&&&value&&=a[end])&&
&&&&&&&&&&&&&&&&begin=&&
&&&&&&&&&&&&else&&
&&&&&&&&&&&&&&&&end=&&
&&&&&&&&}&&
&&&&return&-1;&&
扩展:上面题目中若允许有重复数字如何处理?
分析:& & 允许重复元素,则上一题中如果A[m]&=A[l], 那么[l,m] 为递增序列的假设就不能成立了,比& & 如[1,3,1,1,1]。& & 如果A[m]&=A[l] 不能确定递增,那就把它拆分成两个条件:& & & 若A[m]&A[l],则区间[l,m] 一定递增& & & 若A[m]==A[l] 确定不了,那就l++,往下看一步即可。
int&SearchRotatedArray1(int&a[],&int&n,&int&value)&&
&&&&if(a==NULL&||&n&&=0)&&
&&&&&&&&return&-1;&&
&&&&int&begin=0,&end=n-1;&&
&&&&while(begin!=end)&&
&&&&&&&&int&mid=(begin+end)/2;&&
&&&&&&&&if(value&==&a[mid])&&
&&&&&&&&&&&&return&&&
&&&&&&&&if(a[begin]&&&a[mid])&&
&&&&&&&&{&&
&&&&&&&&&&&&if(a[begin]&&=&value&&&&value&&&a[mid])&&
&&&&&&&&&&&&&&&&end=&&
&&&&&&&&&&&&else&&
&&&&&&&&&&&&&&&&begin=&&
&&&&&&&&}&&
&&&&&&&&else&if(a[begin]&&&a[mid])&&
&&&&&&&&{&&
&&&&&&&&&&&&if(a[mid]&&&value&&&&value&&=a[end])&&
&&&&&&&&&&&&&&&&begin=&&
&&&&&&&&&&&&else&&
&&&&&&&&&&&&&&&&end=&&
&&&&&&&&}&&
&&&&&&&&else&&
&&&&&&&&&&&&begin++;&&
&&&&return&-1;&&
13、求两个排序数组中的所有元素中间值
题目:给定两个已经排序的数组,找出两者所有元素中的中间值
分析:这是一道非常经典的题。这题更通用的形式是,给定两个已经排序好的数组,找到两者所有元素中第k 大的元素。O(m + n) 的解法比较直观,直接merge 两个数组,然后求第k 大的元素。不过我们仅仅需要第k 大的元素,是不需要&排序&这么复杂的操作的。可以用一个计数器,记录当前已经找到第m 大的元素了。同时我们使用两个指针pA 和pB,分别指向A 和B 数组的第一个元素,使用类似于merge sort 的原理,如果数组A 当前元素小,那么pA++,同时m++;如果数组B 当前元素小,那么pB++,同时m++。最终当m 等于k 的时候,就得到了我们的答案,O(k)时间,O(1) 空间。但是,当k 很接近m + n 的时候,这个方法还是O(m + n) 的。有没有更好的方案呢?我们可以考虑从k 入手。如果我们每次都能够删除一个一定在第k 大元素之前的元素,那么我们需要进行k 次。但是如果每次我们都删除一半呢?由于A 和B 都是有序的,我们应该充分利用这里面的信息,类似于二分查找,也是充分利用了&有序&。假设A 和B 的元素个数都大于k/2,我们将A 的第k/2 个元素(即A[k/2-1])和B 的第k/2个元素(即B[k/2-1])进行比较,有以下三种情况(为了简化这里先假设k 为偶数,所得到的结论对于k 是奇数也是成立的):& A[k/2-1] == B[k/2-1]& A[k/2-1] & B[k/2-1]&&A[k/2-1] & B[k/2-1]如果A[k/2-1] & B[k/2-1],意味着A[0] 到A[k/2-1 的肯定在A U&B 的top k 元素的范围内,换句话说,A[k/2-1]不可能大于A U B 的第k 大元素。留给读者证明。因此,我们可以放心的删除A 数组的这k/2 个元素。同理,当A[k/2-1] & B[k/2-1] 时,可以删除B 数组的k/2 个元素。当A[k/2-1] == B[k/2-1] 时,说明找到了第k 大的元素,直接返回A[k/2-1] 或B[k/2-1]即可。因此,我们可以写一个递归函数。那么函数什么时候应该终止呢?& 当A 或B 是空时,直接返回B[k-1] 或A[k-1];& 当k=1 是,返回min(A[0], B[0]);& 当A[k/2-1] == B[k/2-1] 时,返回A[k/2-1] 或B[k/2-1]
bool&glo_InvalidInput=&&
int&find_kth(int&A[],&int&m,&int&B[],&int&n,&int&k)&&
&&&&&&&&if&(m&&&n)&return&find_kth(B,&n,&A,&m,&k);&&
&&&&&&&&if&(m&==&0)&return&B[k&-&1];&&
&&&&&&&&if&(k&==&1)&return&min(A[0],&B[0]);&&
&&&&&&&&int&ia&=&min(k&/&2,&m),&ib&=&k&-&&&
&&&&&&&&if&(A[ia&-&1]&&&B[ib&-&1])&&
&&&&&&&&&&&&return&find_kth(A&+&ia,&m&-&ia,&B,&n,&k&-&ia);&&
&&&&&&&&else&if&(A[ia&-&1]&&&B[ib&-&1])&&
&&&&&&&&&&&&return&find_kth(A,&m,&B&+&ib,&n&-&ib,&k&-&ib);&&
&&&&&&&&else&&
&&&&&&&&&&&&return&A[ia&-&1];&&
double&findMedianSortedArrays(int&A[],&int&m,&int&B[],&int&n)&&&
&&&&if(A&==&NULL&||&B==NULL&||&(m&&=&0&&&&n&&=0))&&
&&&&&&&&glo_InvalidInput=&&
&&&&&&&&return&-1;&&
&&&&int&total&=&m&+&n;&&
&&&&if&(total&&&0x1)&&
&&&&&&&&return&find_kth(A,&m,&B,&n,&total&/&2&+&1);&&
&&&&else&&
&&&&&&&&return&(find_kth(A,&m,&B,&n,&total&/&2)&&
&&&&&&&&+&find_kth(A,&m,&B,&n,&total&/&2&+&1))&/&2.0;&&
14、找出数组中重复次数最多的数
题目:给定一个数组,找出数组中出现重复次数最多的数
方法一:以空间换时间,可以定义一个数组 int count[MAX],并将其数组元素都初始化为0,然后执行for(int i=0;i&n;i++) count[A[i]]++;在count中找最大的数,即为重复次数最多的数。
int&GetMaxNum(int&a[],&int&n&,int&&num)&&
&&&&int&index=a[0];&&
&&&&for(int&i=0;i&n;i++)&&
&&&&&&&&if(a[i]&index)&&
&&&&&&&&{&&
&&&&&&&&&&&&index=a[i];&&
&&&&&&&&&&&&num=i;&&
&&&&&&&&}&&
&&&&return&&&
int&main()&&
&&&&int&a[]={1,1,2,2,4,4,4,4,5,5,6,6};&&
&&&&int&len=sizeof(a)/sizeof(a[0]);&&
&&&&int&num=0;&&
&&&&int&n=GetMaxNum(a,len,num);&&
&&&&int&*count&=&new&int[n+1];&&
&&&&for(int&i=0;i&n;i++)&&
&&&&&&&&count[i]=0;&&
&&&&for(int&i=0;i&i++)&&
&&&&&&&&count[a[i]]++;&&
&&&&cout&&&&"重复的次数:"&&&&GetMaxNum(count,n,num)&&&&&&
&&&&cout&&&&"重复次数最多的数:"&&&num&&&&&&
&&&&delete[]&&&
方法二:使用map映射,通过引入map表来记录每一个元素出现的次数,然后判断次数的大小,进而找出重复次数最多的元素
#include&iostream&&&
#include&map&&&
using&namespace&&&
bool&FindMostFrequentNum(int&a[],int&n,&int&&val,&int&&num)&&
&&&&if(a==NULL&||&n&=0)&&
&&&&&&&&return&&&
&&&&map&int,int&&m;&&
&&&&for(int&i=0;i&n;i++)&&
&&&&&&&&if(++m[a[i]]&&&m[val])&&
&&&&&&&&&&&&val=a[i];&&
&&&&num=m[val];&&
&&&&return&&&
int&main()&&
&&&&int&a[]={1,5,4,3,4,4,5,4,4,5,6};&&
&&&&int&len=sizeof(a)/sizeof(a[0]);&&
&&&&int&val=0;&&
&&&&int&num=0;&&
&&&&if(FindMostFrequentNum(a,len,val,num))&&
&&&&&&&&cout&&&&"重复的次数:"&&&&num&&&&&&
&&&&&&&&cout&&&&"重复次数最多的数:"&&&val&&&&&&
15、求数组中出现次数超过一半的数
题目:在O(n)时间复杂度内找出数组中出现次数超过一半的数
分析:每次取出两个不同的数,剩下的数字中重复出现的数字肯定比其他数字多,将规模缩小化,如果每次删除两个不同的数,那么在剩余的数字里,原最高频数出现的频率一样超过了50%,不断重复这个过程,最后剩下的将全是同样的数字,即最高频数。
int&&Find(int&a[],&int&n)&&
&&&&if(a==NULL&||&n&&=0)&&
&&&&&&&&return&-1;&&
&&&&int&candidate=0;&&
&&&&int&count=0;&&
&&&&for(int&i=0;i&n;i++)&&
&&&&&&&&if(count==0)&&
&&&&&&&&{&&
&&&&&&&&&&&&candidate=a[i];&&
&&&&&&&&&&&&count=1;&&
&&&&&&&&}&&
&&&&&&&&else&&
&&&&&&&&{&&
&&&&&&&&&&&&if(candidate==a[i])&&
&&&&&&&&&&&&&&&&count++;&&
&&&&&&&&&&&&else&&
&&&&&&&&&&&&&&&&count--;&&
&&&&&&&&}&&
&&&&count=0;&&
&&&&for(int&i=0;i&n;i++)&&
&&&&&&&&if(a[i]==candidate)&&
&&&&&&&&&&&&count++;&&
&&&&if(count*2&&=&n)&&
&&&&&&&&return&-1;&&
&&&&return&&&
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!查看: 14747|回复: 13|关注: 0
Matlab寻找一维数组中重复元素出现次数的最有效方法
<h1 style="color:# 麦片财富积分
新手, 积分 5, 距离下一级还需 45 积分
寻找一位数组中重复元素的最有效方法是什么,运算时间最快。。
现在我知道的:
& && && && && && &&&a=[1,3,4,5,6,2,6,8,9]
& && && && && && &&&b=unique(a)
& && && && && && &&&c=zeros(size(b));
& && && && && && &&&for e=1:length(b);
& && && && && && && && & c(e)=length(find(B==b(e)));& && &
& && && && && && &&&end
由于用到了for和unique,使用时效率很低
还有一种也要用unique语句,有没有其他更快的方法?
<h1 style="color:# 麦片财富积分
顶上。。。帮忙啊。。。
<h1 style="color:# 麦片财富积分
顶上顶上,在线等噢。。。等高人。。。
<h1 style="color:# 麦片财富积分
顶上。。。
<h1 style="color:# 麦片财富积分
a=[1,3,4,5,6,2,6,8,9]
b=unique(a)
我想到的是这样
<h1 style="color:# 麦片财富积分
用了unique效率也是比较低的呃。。。比原来的是简单多了,由于在程序中要做很多循环,这样程序运行时间就很长。。
<h1 style="color:# 麦片财富积分
关注者: 4
a=[1,3,4,5,6,2,6,8,9,3,2];
for i=1:length(a)
& & ind(i)=length(find(a==a(i)));
b=unique(a(find(ind&=2)));
也快不了多少,而且你说的函数和循环都要用到:)
<h1 style="color:# 麦片财富积分
关注者: 4
你的不对呀,比如:
a=[1,3,3,5,5,6,2,6,9,9];
b=unique(a);
& &&&5& &&&2& &&&6& &&&9
实际结果应是:
& & 3& && &5& &&&6& &&&9
<h1 style="color:# 麦片财富积分
回复 7# qyb73 的帖子
其实我最主要的目的是统计数组中重复元素的个数。。。现在用
a=[1,3,3,5,5,6,2,6,9,9];
b=unique(a);
c=histc(a,b);
还是不够快。。。
<h1 style="color:# 麦片财富积分
关注者: 4
那样的话,你就参考下unique自己编一个针对一维数组的吧,matlab自带函数是针对所有情况的。至于怎么编吗,呵呵我就爱莫能助了(水平比较菜呵呵)!
站长推荐 /2
机器视觉和人工智能在医疗设备中的应用及实现
MATLAB中文论坛是全球最大的 MATLAB & Simulink 中文社区。用户免费注册会员后,即可下载代码,讨论问题,请教资深用户及结识书籍作者。立即注册加入我们吧!
MATLAB官方社交平台
MATLAB中文论坛微社区

我要回帖

更多关于 找出重复次数最多的 的文章

 

随机推荐