剑指Offer——题43(1~n整数中1出现的次数)

1.题目

求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

2.实现思路

2.1 思路一

累计1-n中每一个数中1出现的次数。将这个数中的每一位依次取出来判断是否为1,

缺点:实现效率太低。

 

 代码实现

public class NumberOf1Between1AndN_Solution2 {
    public static int numberOf1Between1AndN_Solution(int n) {
        int count=0;
      for (int i=0;i<=n;i++){
          count+=numberOfOne(i);
      }
      return count;
    }

    private static int numberOfOne(int i) {
        int base=1;
        int bit=0;
        int count=0;
        while(i/base!=0){
            bit=(i/base)%10;
            if(bit==1){
                count++;
            }
            base=base*10;
        }
        return count;
    }


    @Test
    public void test(){
        int n=12;
        int result=numberOf1Between1AndN_Solution(n);
        System.out.println(result);
    }
}

2.2 思路二:

我们从一个5位的数字讲起,先考虑其百位(即base=100)为1的情况。分3种情况讨论:

百位数字>=2  example: 31256  当其百位为>=2时,有以下这些情况满足(为方便起见,计312为high,56为low):

    100 ~   199

  1100 ~  1199

        .....

 31100 ~ 31199

 余下的都不满足!

因此,百位>=2的5位数字,其百位为1的情况有(high/10+1)*100个数字   (high/10+1)=>对应于 0 ~ 31,且每一个数字,对应范围是100个数(末尾0-99)

百位数字 ==1 example: 31156 当其百位为1时,有以下这些情况满足:

     100 ~   199

   1100 ~  1199

          ......

  30100 ~ 30199

  31100 ~ 31156

因此,百位为1的5位数字,共有high/10)*100+(low+1)

百位数字 ==0 example: 31056 当其百位为0时,有以下这些情况满足:

     100 ~   199

   1100 ~  1199

 30100 ~ 30199

  其余都不满足

因此,百位数为0的5位数字,共有(high/10)*100个数字满足要求

参考博客https://www.cnblogs.com/xuanxufeng/p/6854105.html

 

代码实现

public class NumberOf1Between1AndN_Solution {
    public static int numberOf1Between1AndN_Solution(int n){
        if(n<0){
            return 0;
        }
        int base=1;  
        int current=1;
        int high;
        int low;
        int count=0;
        while((n/base)!=0){
            current=(n/base)%10;  //定义指针p当前指向的位
            high=n/(base*10);     //高位数据(p之前的数据)
            low=n-(n/base)*base;   //低位数据(p之后的数据)

            if(current>1){
                count+=(high+1)*base;
            }else if(current==1){
                count+=high*base+(low+1);
            }else{
                count+=high*base;
            }
            base=base*10;
        }

        return count;
    }

    @Test
    public void test(){
        int n=12;
        int result=numberOf1Between1AndN_Solution(n);
        System.out.println(result);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生就业服务平台管理系统按照操作主体分为管理员和用户。管理员的功能包括学生档案管理、字典管理、试卷管理、试卷选管理、试表管理、考试记录表管理、答详情表管理、错表管理、法律法规管理、法律法规收藏管理、法律法规留言管理、就业分析管理、论坛管理、企业管理、简历管理、老师管理、简历投递管理、新闻资讯管理、新闻资讯收藏管理、新闻资讯留言管理、学生信息管理、宣传管理、学生管理、职位招聘管理、职位收藏管理、招聘咨询管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生就业服务平台管理系统可以提高大学生就业服务平台信息管理问的解决效率,优化大学生就业服务平台信息处理流程,保证大学生就业服务平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理新闻信息,管理大学生就业服务平台信息,包括考试管理,培训管理,投递管理,薪资管理等,可以管理新闻信息。 考试管理界面,管理员在考试管理界面可以对界面显示,可以对考试信息的考试状态进行查看,可以添加新的考试信息等。投递管理界面,管理员在投递管理界面查看投递种类信息,投递描述信息,新增投递信息等。新闻信息管理界面,管理员在新闻信息管理界面新增新闻信息,可以删除新闻信息。新闻信息类型管理界面,管理员在新闻信息类型管理界面查看新闻信息的工作状态,可以对新闻信息的数据进行导出,可以添加新新闻信息的信息,可以编辑新闻信息信息,删除新闻信息信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值