《N诺机试指南》(一)数组妙用

题目A:

 

大家思路有可能是这样: 将输入数据全部存储到一个数组里,然后可以冒泡排序一波,从小到大排序

那么怎么找到重复次数呢:我是这样想的,新定义数组b,原数组a,首先b[0] = a[0],定义指针i指向数组a,j指向原数组b,初值都是0,如果a[i] == b[j],是重复元素,那么i++,continue,否则b[++j] = a[i++]

 

这个有点复杂,有没有简单做法?

  数不多:可以利用数组的标记特性:定义数组a,全部赋值为0,然后输入为k,则令a[k]++,最后打印a[k]>0的即可,见代码1

  数很多,范围很大:可以用Map存储,key作为数字,对应value作为出现次数,找到重复的取出对应value+1,见代码2

           也可以用vector存储,遍历数组如果不在vector里那么就加入到vector里并且赋值为1,如果在则v[i]+1

代码1:

#include <bits/stdc++.h>
using namespace std;

int a[105] = {0};//注意尽量把数组定义在全局,方便很多 

int main(){
	int n,x;
	scanf("%d", &n);
	for(int i=0; i<n; i++){
		scanf("%d", &x);
		a[x]++;
	}
	
	for(int i=0; i<n; i++){
		if( a[i]>0 ){
			printf("%d:出现次数%d\n", i, a[i]);
		} 
	}
	
	return 0;
}

 

 结果:

代码2:

public class CountNumber{
  
    public static void mian(String[] args){
        int[] arr = {1,2,3,4,8,2,2,5,3,1,2,4,5,2}
        int[] ans = maxTimsx(arr);
        System.out.println("数字:" + ans[0] + "出现" + ans[1] + "次")
    }  
 
    public static int[] maxTimes(int[] arr){
        if(arr == null || arr.length < 1){
                return null;
        }
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
        
        int times = 0;
        int number = 0;
     
      //缺少一个步骤:先把arr数组排序
        for(i=0;i<arr.length;i++){
            if(map.get(arr.[i]) == null){//没有就存进map里去
                map.put(arr[i],1)//初始value为1
            }
        }else{
            integer value = map.get(arr[i]) + 1;//有说明有重复的,加1
            map.put(arr[i],value)
            if(value > times){//找出最大的
                times = value;
                number = arr[i];
            }
        }
 
        return new int[] {number,times};
    }
}

 

题目A plus版本:

 

解析:可以新加一个数组,用来存储拥有相同数字个数i的最大那个值

代码:

 

posted @ 2020-02-15 19:35  Kimishima-Kana  阅读(289)  评论(0编辑  收藏  举报