- 方法一,我们使用最简单的list + map集合
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String n = in.nextLine();
HashMap<Integer,Integer> map = new HashMap();
List<Integer> list = new ArrayList();
for(int i=0;i<n.length();i++){
//这边 -‘0’很重要,需要转换成数字
list.add(Integer.valueOf(n.charAt(i) - '0'));
}
for(int i=0;i<list.size();i++){
if(map.get(list.get(i)) == null){
map.put(list.get(i),1);
}else{
int num = map.get(list.get(i));
map.put(list.get(i),++num);
}
}
//每次遍历list集合的时候总会遇到重复的,所以我们使用一个boolean数组,这样就可以排除已经访问过的位置了。
boolean[] used = new boolean[10];
Collections.sort(list);
for(int i=0;i<list.size();i++){
if(used[list.get(i)] == false) {
System.out.println(list.get(i) + ":" + map.get(list.get(i)));
used[list.get(i)] = true;
}
}
}
}
- 我们可以看到这样非常麻烦,那我们可以想一下,因为每一个位置上的数字都是在[0,9]之间,所以我们可以直接定义一个长度为10的数组,用来记录每一个数字的个数;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String N = in.nextLine();
int[] nums = new int[10];
for(int i=0;i<N.length();i++){
int index = Integer.valueOf(N.charAt(i) - '0');
nums[index]++;
}
for(int i=0;i<nums.length;i++){
if(nums[i] == 0){
continue;
}
System.out.println(i + ":" + nums[i]);
}
}
}
3.最后,近期在学习c++,附上一个C++版本吧
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
string n;
//因为这边输入的是字符串,所以不能直接用cin
// cin >> n;
getline(cin,n);
//c++中要在用之前一定要赋初值,不像java那样,java中不赋初值就会直接报错
int nums[10] = {0};
for(int i=0;i<n.length();i++){
//这边使用的是c++中的流,这个很厉害,后期我再深入研究一下
stringstream sstream;
int index;
//这边就是读取字符串中的字符放到流中去
sstream << n[i];
//将流中的数据转换成int类型,然后再赋值给index
sstream >> index;
nums[index]++;
}
//sizeof(nums)是nums数组所占的内存,sizeof(nums[0])是某一个元素所占的内存,那么这样就可以计算总的数组长度
int len = sizeof(nums)/sizeof(nums[0]);
for(int i=0;i<len;i++){
//为了去除那些字符串中都没有出现的数据
if(nums[i] == 0){
continue;
}
cout << i << ":" << nums[i] << endl;
}
return 0;
}