题目描述
链接:https://www.nowcoder.com/questionTerminal/a2063993dd424f9cba8246a3cf8ef445
来源:牛客网
给定一个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的升序输出。
示例1
输入
100311
输出
0:2<br/>1:3<br/>3:1
思路
先说一个笨办法,就是将输入的数,每个位上的数存在数组里,对数组排序, 然后统计每个数字出现的次数,注意当最大数只有一个的时候,要注意特殊处理。
代码
import java.util.Arrays;
import java.util.Scanner;
/**
* @ Created with IntelliJ IDEA.
* @ClassName Test
* @Description
* @Author by小房
* @Date 2020/7/9 22:30
*/
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String str = scanner.nextLine();
int len = str.length();
int[] array = new int[len];
for (int i = 0; i <len ; i++) {
array[i] = Integer.parseInt(String.valueOf(str.charAt(i)));
}
Arrays.sort(array);
if (len == 1) {
System.out.println(array[0] + ":" + 1);
return;
}
int i = 0;
for (; i < len-1 ; i++) {
int count = 1;
while ( i < len-1 && array[i+1] == array[i]) {
count++;
i++;
}
System.out.println(array[i] + ":" + count);
}
if (i == len-1) {
System.out.println(array[len-1] + ":" + 1);
}
}
}
}
思路二
将给定的数字按照每位拆分为单个数字然后保存在list中,每碰到一个相同的数字就值加一,扫描完整个字符串后遍历输出list集合即可。
代码2
import java.util.*;
public class Test2 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String N = sc.next();
char[] chars = N.toCharArray();
/**
* list***有10个item表示0-9,每个item的值表示数字的个数
*/
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
list.add(0);//初始化每个item都是0
}
for (int i = 0; i < chars.length; i++) {
// 每遇到一个数字,就把值+1
list.set(chars[i]-'0',list.get(chars[i]-'0')+1);
}
for (int i = 0; i < list.size(); i++) {
if (list.get(i)>0){
System.out.println(i+":"+list.get(i));
}
}
}
}