首页 > 试题广场 >

算法题 已知一个已经从小到大排列好的数组,说这个数组中

[问答题]

算法题

已知一个已经从小到大排列好的数组,说这个数组中的一个平台(Plateau),就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在1,2,2,3,3,3,4,5,5,61,2.2,3.3.3,4,5.5,6都是平台。试编写一个程序,接收一个数组,把这个数组中最长的平台找出来。在上面的例子中3.3.3是该数组中最长的平台。


【说明】

这个程序十分简单,但是要编写好却不容易,因此在编写程序时应该考虑下面几点:

1)   使用的变量越少越好


2)   能否只把数组的元素每一个都只查一次就得到结果?


3)   程序语句越少越好。

# include<iostream>
using namespace std;

int main() {
	int arr[16] = {'1','1','2','2','3','3','3','3','5','5','5','5','5','5','5','5'};
	//i遍历的时候用
	int i = 1;
	//h表示长度(初始化为0)
	int h = 1;
	//maxh表示最大长度
	int maxh = 1;
	for (i ; i < (sizeof(arr)/sizeof(char)) - 1 ; i++) {
		if(arr[i] == arr[i - 1]) {
			h++;
		}else if(arr[i] != arr[i - 1] && h > maxh) {
			//刷新maxh
			maxh = h;
			//刷新h
			h = 1;
		}
		else {
			//刷新h
			h = 1;
			}
	}
	cout<<maxh<<endl;
	return 0;
}

发表于 2019-09-17 16:54:00 回复(0)
package demo1;

public class demo5 {
	public static void main(String[] args) {
		int[] num = {1,1,1,1,1,2,2,3,4,4,5,5,5,7,7};
		plateau(num);
	}
	public static void plateau(int[] num){
		int i = 1,j =0,m =0,n = 0;
		for(int z=1;z<num.length;z++){
			if(num[z] == num[z-1]){
				i++;
				m=num[z];
			}
			if(num[z] != num[z-1]){
				if(i>j){
					j=i;
					n=m;
				}
					i=1;
					m=num[z];
			}	
		}
		if(i>j){
			j=i;
			n=m;
		}
		System.out.print(j+"  "+n);
	}

}

发表于 2019-10-04 15:02:29 回复(0)

private static void pr(int[] ns)
	{
		// 逐个遍历,遇到相同的计数+1
		int before_length = 1;
		int now_length = 1;
		int num = 0;
		for(int i=0;i<ns.length-1;i++)
		{
			if(ns[i]==ns[i+1])
			{
				now_length ++;
			}
			else
				now_length = 1;
			if(now_length > before_length)
			{
				before_length = now_length;
				num = ns[i];
			}

		}
		System.out.println("num:"+num+"\tlength:"+before_length);
	}




编辑于 2020-03-20 12:06:34 回复(0)
这个题给的参考答案有问题吧
发表于 2021-03-06 16:25:44 回复(0)
public static void searchMaxPlat(int[] nums){
		int tempMax = 0;
		int resMax = 0;
		int end = 0;
		for(int i=0;i<nums.length-1;i++) {
			if(nums[i]!=nums[i+1]) {
				if(resMax<tempMax) {
					resMax = tempMax+1;
					end = i;
				}
				tempMax=0;
			}else {
				tempMax++;
			}
		}
		for(int i=end-resMax+1;i<=end;i++) {
			System.out.print(nums[i]+" ");
		}
	}

发表于 2020-03-16 16:44:25 回复(0)
#include<iostream>
#include<string>
#include<iomanip>
#include<map>
#include<vector>
#include<cmath>
#include<list>
#include<stdlib.h>
#include<ostream>
#include<set>
#include<queue>
#include<stack>
#include<deque>
using namespace std;

# define ll long long
# define ull unsigned long long
# define inf 0x3f3f3f3f
# define ll_inf (1ll<<60)
const int maxn = 2e2 + 100;

int a[maxn];
int main(){

    int n ;
    cin>>n;
    for(int i =0 ; i < n ;i++){
        scanf("%d",&a[i]);
    }
    map<int,int>vis;
    int maxx = 1;
    vis[a[1]]++;
    for(int i = 1 ; i < n + 1;i++){
       maxx = max(maxx , vis[a[i-1]]);
        if(a[i] != a[i-1]){
            vis[a[i-1]] = 0;
            vis[a[i]] = 1;
        }
        else {
        vis[a[i]]++;
        maxx = max(maxx , vis[a[i]]);
        }
    }
    maxx = max(maxx ,vis[a[n-1]]);
    printf("%d\n",maxx);
    return 0;
}

发表于 2019-09-12 10:35:03 回复(0)