Java-个位数统计 (15)

本文介绍了一个程序设计问题:如何统计一个大整数中不同个位数字的出现次数,并提供了一段Java代码实现。该程序可以接收任意长度不超过1000位的整数作为输入,然后输出每种不同个位数字及其出现次数。

题目描述

给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + 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
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner in = new Scanner(System.in);
		//用于存储输入的数字
		String string = in.next();
		in.close();
		int[] count = new int[10];
		//遍历每个数字,并增加对应数字出现的次数
		for (int i = 0; i < string.length(); i++) {
			char c = string.charAt(i);
			count[c-'0']++;
		}
		for (int i = 0; i < count.length; i++) {
			if (count[i] != 0) {
				System.out.println(i+":"+count[i]);
			}
		}
	}

}


<think>好的,我现在需要帮助用户解决如何使用Java实现L1-003题目的个位数统计功能。首先,我得仔细看一下题目要求。题目是给定一个k位整数N,统计每个个位数字出现的次数。例如输入100311,输出0出现2次,1出现3次,3出现1次。 根据用户提供的引用内容,特别是引用[3],里面有一个Java代码示例。用户可能希望得到类似的解决方案。我需要确保自己理解代码的结构和逻辑。代码中,用户将输入转换为字符数组,然后统计每个字符对应的数字出现的次数,最后输出结果。 首先,我应该考虑输入的处理。因为输入的整数可能非常大,超过普通整数类型的范围,所以直接将其作为字符串处理会更安全。这样就不用担心数值溢出问题。比如,用户输入可能是一个很长的数字字符串,用字符串处理可以逐个字符检查。 接下来,统计次数的方法。可以使用一个长度为10的整数数组,索引0到9分别对应数字0到9的出现次数。遍历字符串中的每个字符,将字符转换为数字(例如,字符'5'转换为5),然后对应的数组位置加1。 然后,输出结果时需要遍历这个数组,只输出出现次数大于0的数字及其次数。例如,如果数组索引3的位置是1,那么输出3:1。 现在,我需要考虑代码的具体实现。用户提供的引用[3]中的代码使用了Scanner和PrintWriter,这可能是因为在Java中处理输入输出时效率的考虑。不过,使用标准的System.in和System.out对于一般的题目应该也足够了,但要注意可能存在的性能问题。不过,根据题目的输入规模,可能不需要特别优化。 另外,代码中使用了char数组,将每个字符转换为数字。这里需要注意的是,字符'0'到'9'的ASCII码是连续的,所以减去'0'可以得到对应的数值。例如,'0'的ASCII码是48,减去48得到0,'1'是49,得到1,以此类推。 接下来,可能要考虑输入的正确性。题目中提到输入是一个k位整数,且dk−1>0,即第一个字符不能是0。不过,题目可能保证输入是合法的,所以代码中可能不需要额外的校验,直接处理即可。 现在,总结步骤: 1. 读取输入字符串。 2. 初始化一个长度为10的整型数组,初始值全为0。 3. 遍历字符串的每个字符,转换为数字,并增加对应的数组元素。 4. 遍历数组,输出出现次数不为0的数字及其次数。 然后,将这些步骤转化为Java代码。需要注意的是,当输入可能很大时,使用字符串处理更合适。例如,用户输入可能类似于"100311",直接转为字符数组处理。 现在,检查用户提供的引用中的代码是否有需要注意的地方。例如,在引用[3]中,代码使用了Scanner和PrintWriter,这可能是因为在OJ系统中,使用PrintWriter可以提高输出效率。同时,代码中将输入的字符串转为字符数组,遍历每个字符,然后统计次数。 可能需要注意的地方是异常处理,但题目可能保证输入合法,所以可以省略。另外,代码中的数组大小为10+10,可能没有必要,只需要10个元素即可,不过后面的索引可能不会用到,不影响结果。 现在,编写代码的大致结构: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); int[] cnt = new int[10]; for (char c : s.toCharArray()) { int num = c - '0'; cnt[num]++; } for (int i = 0; i < 10; i++) { if (cnt[i] > 0) { System.out.printf("%d:%d\n", i, cnt[i]); } } } } 这样应该可以实现功能。但需要考虑是否有前导零的情况。根据题目描述,输入的N是一个k位整数,且dk−1>0,所以输入字符串的第一个字符不会是0,所以在统计的时候,数字0的出现次数可能来自中间或末尾的字符,比如示例中的100311,两个0是在中间和末尾的位置。 所以代码不需要处理前导零的问题,因为输入本身不会出现前导零。 另外,测试用例是否正确。例如输入100311,输出是否正确?代码会遍历每个字符,统计0、1、3的出现次数。是的。 现在,用户的问题是如何用Java完成这个功能,所以需要给出详细的步骤解释,并确保代码正确。 可能还需要处理输入中的其他问题,比如是否会有非数字字符?题目中说明输入的是k位整数,所以应该只有数字字符,因此代码不需要处理其他字符的情况。 总结,解决方案是正确的,可以按照上述步骤实现。</think>### 分步解答 #### 1. 输入处理 由于输入的整数可能非常大(例如超过`Long`类型的范围),应当**直接读取为字符串**处理,避免数值溢出问题。例如: ```java Scanner sc = new Scanner(System.in); String number = sc.next(); // 读取输入的数字字符串 ``` #### 2. 统计数字频率 使用**长度为10的整型数组**存储0-9数字的出现次数。遍历字符串中的每个字符,将字符转换为数字后更新对应索引的计数值: ```java int[] count = new int[10]; for (char c : number.toCharArray()) { int digit = c - '0'; // 字符'0'-'9'转换为数字0-9 count[digit]++; } ``` #### 3. 输出结果 遍历统计数组,按格式输出出现次数大于0的数字及其频次: ```java for (int i = 0; i < 10; i++) { if (count[i] > 0) { System.out.printf("%d:%d\n", i, count[i]); } } ``` ### 完整代码实现 ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String number = sc.next(); int[] count = new int[10]; for (char c : number.toCharArray()) { int digit = c - '0'; count[digit]++; } for (int i = 0; i < 10; i++) { if (count[i] > 0) { System.out.printf("%d:%d\n", i, count[i]); } } } } ``` ### 关键点说明 1. **字符转换原理**:通过`c - '0'`将字符转换为对应的整数值,例如字符`'5'`的ASCII码为53,减去`'0'`的ASCII码48后得到整数5[^3]。 2. **时间复杂度**:算法的时间复杂度为$O(k)$,其中$k$是输入数字的位数,效率较高。 3. **适用性**:该方法适用于任意长度的整数统计,避免了数值类型限制问题[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值