<剑指Offer>面试题43: 1 ~ n 整数中 1 出现的次数

题目描述 牛客网

  • 输入一个整数 n,求 1 ~ n 这 n 个整数的十进制表示中 1 出现的次数
  • 例如, 输入 12, 1 ~ 12 这些整数中包含 1 的数字有 1, 10, 11,12; 1 共计出现了 5 次

题目解读

  • 剑指Offer 221
  • 思路一,常规方法,不考虑时间效率
  • 思路二,看牛客讨论区的方法,很优秀,点我

代码

  • 思路一,常规方法,不考虑时间效率
#include
using namespace std;

class Solution {
public:
    int numberof1(int x){
        int len = 0;

        while(x != 0){
            if(x%10 == 1){
                len ++;
            }
            x /= 10;
        }
        return len;
    }

    int NumberOf1Between1AndN_Solution(int n)
    {
        int numof1 = 0;
        for(int i=1; i <= n; i++){
            numof1 += numberof1(i);
        } 
        return numof1;   
    }
};

int main(){
    Solution ss;
    
    cout<
<剑指Offer>面试题43: 1 ~ n 整数中 1 出现的次数_第1张图片
  • 思路二,看牛客讨论区的方法,很优秀,点我

主要思路:设定整数点(如1、10、100等等)作为位置点i(对应n的各位、十位、百位等等),分别对每个数位上有多少包含1的点进行分析
根据设定的整数位置,对n进行分割,分为两部分,高位n/i,低位n%i
1、当 i 表示百位,且百位对应的数字>=2,如 n=31456,i=100,则a=314,b=56,此时百位为1的次数有a/10+1=32(最高两位0~31),每一次都包含100个连续的点,即共有(a%10+1)100 个点的百位为 1
2、当 i 表示百位,且百位对应的数字为 1,如 n=31156,i=100,则 a=311,b=56,此时百位对应的就是1,则共有 a%10 (最高两位0-30)次包含 100 个连续点,当最高两位为31(即a=311),本次只对应局部点00~56,共b+1次,所有点加起来共有(a%10
100)+(b+1),这些点百位对应为1
3、当i表示百位,且百位对应的数为0,如n=31056,i=100,则a=310,b=56,此时百位为1的次数有a/10=31(最高两位0~30)
综合以上三种情况,当百位对应0或>=2时,有(a+8)/10次包含所有100个点,还有当百位为1(a%10==1),需要增加局部点b+1

#include
using namespace std;

class Solution {
public:

    int NumberOf1Between1AndN_Solution(int n)
    {
        int ones = 0;
        for(int i=1; i <= n; i*=10){
            int gaowei = n / i;
            int diwei = n % i;

            if(gaowei % 10 == 0){
                ones += (gaowei / 10) * i;
            }
            else if(gaowei % 10 == 1){
                ones += (gaowei / 10) * i + (diwei + 1);
            }
            else{
                ones += ((gaowei / 10) + 1) * i;
            }
        }
        return ones;
    }
};

int main(){
    Solution ss;
    
    cout<
<剑指Offer>面试题43: 1 ~ n 整数中 1 出现的次数_第2张图片

总结展望

  • 讲道理,第二种方法应该比第一种要快的,但是牛客运行时间竟然一样,真是服气,应该是牛客测试数据量小吧.

你可能感兴趣的:(<剑指Offer>面试题43: 1 ~ n 整数中 1 出现的次数)