题目:
给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M
的格式在一行中输出该位数字 D
及其在 N 中出现的次数 M
。要求按 D
的升序输出。
输入样例:
100311
输出样例:
0:2
1:3
3:1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
Java (javac)
想法1:先将整数装入数组中在进行升序,存入map集合。(map集合数据不能重复,且get(i)可以改变)。
代码实现:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//用字符串存储数据,在将字符串装入int类型的数组中
String s = sc.nextLine();
String s1[]=s.split("");
int a[]=new int [s1.length];
for(int i =0;i<s1.length;i++){
a[i]=Integer.parseInt(s1[i]);
}
show(a);
}
//定义show方法
private static void show(int a[] ){
Map<Integer,Integer>map = new HashMap<>();
//遍历a数组
for(int i : a){
//进行判断,如果map集合containsKey(i),将map.get(i)+1;
if(map.containsKey(i)){
map.put(i,map.get(i)+1);
//如果map集合不包含containsKey(i),则map.put(i,1);
}else{
map.put(i,1);
}
}
//遍历map集合
for(Map.Entry<Integer,Integer>entry:map.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
想法2:使用Treemap,不管存入的数据(暂且为int类型)是否有序,遍历时都会有序输出(升序)。
代码实现:
package 天梯赛;
//以下的导包可以使用import java.util.*;表示,直接导入所有的包。
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
show(a);
}
public static void show(int a ){
//定义Treemap集合
Map<Integer,Integer>map=new TreeMap<>();
//判断是否为0
if(a==0){
int b = 0;
map.put(b,1);
}
while(a>0){
//取最后一位
int dight = a%10;
//将数去掉最后一位
a/=10;
map.put(dight,map.getOrDefault(dight,0)+1);
//此方法和刚刚差不多,只是表示方式不同:
if(map.containsKey(i)) {
map.put(i,map.get(i)+1);
}else{
map.put(i,1);
}
}
//最后遍历集合map即可
for (Map.Entry<Integer,Integer>entry:map.entrySet()) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
大概讲一下map.put(dight,map.getOrDefault(dight,0)+1);的作用
map.put(dight, map.getOrDefault(dight, 0) + 1);
是Java中处理Map
集合(特别是Map<K, V>
)的常用方式。这行代码的目的是更新Map
中特定键的值。具体来说,它试图对键dight
对应的值进行加一操作。
详细解释如下:
map.getOrDefault(dight, 0)
: 这是一个Map
的方法,它尝试获取键dight
对应的值。如果该键存在于map
中,则返回其对应的值;如果该键不存在,则返回默认值0
。map.getOrDefault(dight, 0) + 1
: 这部分代码将上面获取到的值(或默认值0
)加1
。map.put(dight, ...)
: 使用put
方法将键dight
和更新后的值(即原值加1
)放回map
中。
简单的说法:
- 如果
map
中已经包含键dight
,则将其对应的值加1
。 - 如果
map
中不包含键dight
,则将其添加到map
中,并为其设置值1
。
这样的操作在统计各种数据(例如,统计一个数组中每个数字出现的次数)时非常有用。