1 题目
1.1图片
1.2原题链接
链接:https://www.dotcpp.com/oj/problem1633.html
2 分析
2.1算法分析
排序函数,先从小到大排序好,然后依次进行数据的统计计数,当a[i]!=a[i-1]的时候,就说明分段了,此时就是一个新的数了。
2.2技巧分析
注意:
- 我的for循环的i是从1开始的
- 计数的count也是从1开始的
- 输出的是if判断语句之后的a[i-1],也就是上次出现的数。
- 最后一个数是单独输出的,原因就是因为我最终只能输出到a[i-1],即使i=length-1了,我也没法输出length-1这个元素,因此是要单独输出的
- 最后一个数的个数是算出来的,这样更快一点
3 关键点
动态规划、排序函数、Scanner的控制台输入、格式
这里的格式我也不想说太多,大家有在网上刷题的应该知道,输入输出是严格按照要求的,前三次我的格式错误的原因就是因为自己多输出了一个System.out.println();自己在测试的时候加这个是为了阅读的方便。放进题库中的编译器忘记去掉这个就跑不通过了。总而言之,格式很重要!!!
4 代码
package 动态规划;
import java.util.Arrays;
import java.util.Scanner;
public class Demo_1633 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int length=scanner.nextInt();//输入长度
int [] a=new int [length];//定义数组
for(int i=0;i<length;i++){//往数组中写入数据
a[i]=scanner.nextInt();
}
//排序之后数组变成从小到大
Arrays.sort(a,0,length);
int count=1;//记录数出现的个数
int MaxCount=0;
for(int i=1;i<length;i++){
if(a[i]!=a[i-1]){
System.out.print(a[i-1]+" ");
System.out.println(count);
MaxCount+=count;//为计算最后一个数的个数做准备
count=1;//赋值为1,对一个新的数进行统计个数
}else{
count++;
}
}
System.out.print(a[length-1]+" "+(length-MaxCount));
}
}
5 小吐槽
不要问我为什么这样做奥,毕竟这是算法知识,可以千变万化的,而且这种是最简单最基础的,,,以前用dot是写C或者C++去编译。
- 如果我写的是C语言,我会用冒泡排序的方法,输入的话就用while语句和scanof搭配输入,同样用数组。
- 如果我写的是C语言,我会用sort排序,这里我输入的时候就用字符串进行输入了,,,因为这样我看起来爽一点。
- 至于java,就上面的,简单粗暴,sort排序都封装好了,有多想不开才用桶排序、快速排序、冒泡排序去做呀。。。