`
wang吖
  • 浏览: 240707 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java统计1到n的自然数中其中字符1出现的次数

 
阅读更多

用Java代码实现:1到n的自然数中其中 ‘1’  出现的次数,例如:1,11,12,100 中 ‘1’出现了5次。  

该问题的实现关键在于效率问题的考虑,如下是示例代码:

Coding:

/**
 * 统计在从1到n的正整数中1出现的次数
 * 
 * @author 吖大哥
 * @date Jun 11, 2014 10:26:21 PM
 */
public class CountOne {

	public static void main(String[] args) {

		int n = 10000000;

		long start = System.currentTimeMillis();
		int sum1 = CountOne.cnt(n);
		long end = System.currentTimeMillis();

		System.out.println(" sum1 历时 :" + (end - start) + " 出现 1 的次数: " + sum1);

		long start2 = System.currentTimeMillis();
		int sum2 = CountOne.numOF(n);
		long end2 = System.currentTimeMillis();
		System.out.println(" sum2 历时 :" + (end2 - start2) + " 出现 1 的次数: "
				+ sum2);

		long start3 = System.currentTimeMillis();
		int sum3 = CountOne.countNumOf1(n);
		long end3 = System.currentTimeMillis();

		System.out.println(" sum3 历时  :" + (end3 - start3) + "  出现 1 的次数: "
				+ sum3);
	}

	/**
	 * 效率极差
	 * 
	 * @param n
	 * @return
	 */
	public static int cnt(int n) {
		int count = 0;
		String chr = "1";
		while (n >= 1) {
			String str = n + "";
			for (int i = 0; i < str.length(); i++) {
				if (str.indexOf("1") == -1) {// 如果字符串中没1 直接跳出循环
					break;
				}
				if (chr.equals(str.charAt(i) + "")) {
					count++;
				}
			}
			n--;
		}
		return count;
	}

	/**
	 * 效率稍好点
	 * 
	 * @param n
	 * @return
	 */
	public static int numOF(int n) {
		int number = 0;
		for (int i = 1; i <= n; ++i) {
			number += numberOf1(i);
		}
		return number;
	}

	public static int numberOf1(int n) {
		int number = 0;
		while (n != 0) {
			if (n % 10 == 1) {
				number++;
			}
			n = n / 10;
		}
		return number;
	}

	/**
	 * 效率惊人
	 * 
	 * 思路:分别计算 "1" 在每个位上面出现的次数,叠加起来
	 * 
	 * @param n
	 * @return
	 */
	public static int countNumOf1(int n) {
		if (n <= 0) {
			return 0;
		}
		int count = 0;
		int factor = 1;
		while (n / factor != 0) {
			int lowerNum = n - n / factor * factor;
			int currentNum = (n / factor) % 10;
			int highNum = n / (factor * 10);

			if (currentNum == 0) {
				// 如果为0,出现1的次数由高位决定
				count += highNum * factor;
			} else if (currentNum == 1) {
				// 如果为1,出现1的次数由高位和低位决定
				count += highNum * factor + lowerNum + 1;
			} else {
				// 如果大于1,出现1的次数由高位决定
				count += (highNum + 1) * factor;
			}
			factor *= 10;
		}
		return count;
	}

}

 

分享到:
评论

相关推荐

    java小练习,Java练习小程序,Java必用

    - 统计一个字符串中每个字符出现的次数。 - 使用HashMap存储每个字符的出现次数。 49. **字符串操作**: - 给定一个字符串,找出其中最长的连续数字子串。 - 可以使用循环结构和计数器变量实现最长子串的查找。...

    Java初级逻辑测试经典19题

    #### 题目9:统计字符串中数字出现的次数 **描述:** 给定一个字符串,统计其中数字出现的总次数。 **解析:** 通过遍历字符串并检查每个字符是否为数字来完成。 **实现思路:** 1. 使用循环遍历字符串中的每个字符...

    java逻辑题

    题目中提到了统计字符串中英文字符的数量,这通常可以通过遍历字符串并检查每个字符的ASCII值来实现。 ### 知识点十:算法设计 算法设计是解决特定问题的一系列步骤。题目中涉及了多个算法设计的实例,如斐波那契...

    java逻辑50题

    数列定义为`F(n) = F(n-1) + F(n-2)`,其中`F(1)=1, F(2)=1`。 - **迭代算法**:通过循环计算每个月的兔子数量,直到达到指定的月份数。 - **变量初始化**:为了计算序列中的每一项,需要正确地初始化初始值。 - *...

    Java50道经典题目

    - **知识点**: 字符串处理中常见的问题是统计特定字符的出现次数。 - **实现方法**: - 使用循环读取字符串中的每个字符。 - 判断当前字符是否为英文字母,如果是,则统计计数器。 #### 8. 数字串求和 - **知识点*...

    java算法练习试题

    【程序 7】此题要求统计输入字符串中字母、空格、数字和其他字符的数量。可以使用字符数组或HashMap来存储各类型字符的计数,遍历输入字符并更新相应的计数。 【程序 8】这是一道关于字符串处理和循环的问题。输入...

    50道Java经典编程练习(附答案)

    **题目描述:** 编写一个程序,统计输入字符串中英文字母的出现次数。 由于提供的代码片段不完整,这里不再进行详细的代码分析。但是,实现该功能的基本思路是: - 读取用户输入的字符串。 - 遍历字符串中的每一个...

    Java32道算法题

    3. **字符统计**(程序7):这个程序要求统计英文字符、空格、数字和其他字符的数量。这涉及到字符处理和条件判断,通过while循环遍历输入的字符流并根据字符类型进行计数。 4. **字符串累加**(程序8):该问题...

    50个java笔试和面试常用的算法小程序

    本程序首先将输入的字符串转换为小写,然后遍历每个字符,如果字符是字母,则在哈希表中记录其出现次数。最后输出每个字母及其出现的次数。 以上就是从给定文件中提炼出的七个Java编程相关的知识点,包括斐波那契...

    java经典编程题

    虽然题目7的内容未完整给出,但通常这类题目会涉及到字符串的输入输出及操作,比如统计某个字符串中英文字母的出现次数或进行大小写转换等。这通常会用到`Scanner`类来获取用户的输入,然后使用各种字符串操作方法来...

    java入门题目

    - **描述**:读入一段文本,统计其中各字母出现的频率。 - **解析**:使用`while`循环读取输入,对每个字符进行计数,直到遇到换行符`\n`。可以使用数组或哈希表来存储每个字母的频率。 #### 题目八:计算特定序列...

    2016年蓝桥杯java高职C组.docx

    根据给定文件的信息,我们可以总结出以下几个相关的IT知识点: ### 1. 计算猜谜活动中小明...以上五个知识点涵盖了字符串处理、数学计算、递归算法等多方面的内容,有助于理解Java编程语言中的基本概念和技术应用。

    java 经典算法

    统计一段英文文本中各个单词出现的次数。 - **算法步骤**: - 使用字符串分割函数,按空格或标点符号切分文本。 - 遍历所有单词,使用哈希表记录每个单词出现的次数。 - 输出结果。 #### 8. 数字串计算 给定一个...

    java基础50题

    - **背景**:输入一行字符,统计其中字母、空格、数字和其他字符的数量。 - **算法思路**:使用循环读取每个字符,并根据字符类型进行计数。 - **实现方法**:遍历输入字符串中的每个字符,使用条件判断来分类计数。...

    java基础练习50题

    - 素数判断:素数是只能被1和自身整除的大于1的自然数。可以使用循环结构从2到该数的平方根遍历检查是否能被整除。 - 循环结构:使用`for`循环遍历可能的除数。 - 数学函数:使用`Math.sqrt()`获取数的平方根。 ...

    java基础经典题及答案

    这部分代码片段不完整,但可以推测是用于统计一段英文文本中的单词数量或特定单词出现的次数。 **示例代码:** 由于代码片段不完整,这里提供一个简化的示例代码: ```java import java.util.Scanner; import java....

    求最大素数

    - **减少循环次数**:在内层循环中,其实无需遍历到`n`,只需要遍历到`sqrt(i)`即可,因为一个合数必定有一对因子,其中一个因子不会超过其平方根。 - **更高效的素数检测**:使用埃拉托斯特尼筛法或更先进的算法,...

    java基础编程题

    - 实现思路:使用while循环读取文件中的每一个字符,直到遇到换行符`\n`为止,并记录每个字符出现的次数。 --- #### 八、特殊序列求和 **知识点:** - **字符串拼接**:如何将数字转换为字符串并拼接。 - **循环...

    【0 基础学 Java】习题1:分支循环

    8. 统计 1 到 100 中数字的出现次数: - 使用数组记录每位数字出现的次数。 9. 输出 1 到 100 中包含数字 9 的数: - 遍历 1 到 100,检查每个数的字符串表示是否包含字符 '9'。 10. 求解水仙花数: - 水仙花数...

Global site tag (gtag.js) - Google Analytics