zoukankan      html  css  js  c++  java
  • 面试题:1到N中,1出现的次数

     1 #include <iostream>
     2 #include <string>
     3 #include <memory.h>
     4 #include <vector>
     5 #include <sstream>
     6 using namespace std;
     7 
     8 /*
     9 统计1~N之间1出现的次数:分别对当前位的高位和低位找规律。
    10 其实这个问题可以扩展为统计1~N之间,m出现的次数0<=m<=9。
    11 
    12 思路:
    13 对于当前位(出现m的次数):
    14 如果小于m,只和高位有关系如m=1,N=203,那么十位出现的次数就是10~19,110~119;
    15 如果等于m,m=1,N=213,十位出现次数是10~19,110~119,210~213;
    16 如果大于m,m=1,N=223,十位出现次数是10~19,110~119,210~219;
    17 */
    18 //这个函数只求1出现的次数
    19 int fun(int N)
    20 {
    21     if(N < 1)
    22         return 0;
    23 
    24     stringstream ss;
    25     ss<<N;
    26     string s = ss.str();
    27 
    28     int len = s.length();
    29     int i = len - 1;
    30     int cnt = 0;
    31     int num = s[i]-'0';
    32     //处理最低位
    33     if(num > = 1)
    34         cnt = 1;
    35     //处理最高位
    36     stringstream ss1(s.substr(1,len-1));
    37     ss>>num;
    38     cnt += num+1;
    39     for(i = 1 ; i < len-1 ; ++i)
    40     {
    41         num = s[i]-'0';
    42         if(num > 1)
    43         {
    44             int num_higher = s[i-1]-'0';
    45             cnt += (num_higher+1)*10;
    46         }
    47         else if(num == 1)
    48         {
    49             int num_higher = s[i-1]-'0';
    50             int num_lower = s[i+1]-'0';
    51             cnt += (num_higher)*10+num_lower+1;
    52         }
    53         else
    54         {
    55             int num_higher = s[i-1]-'0';
    56             cnt += (num_higher)*10;
    57         }
    58     }
    59     return cnt;
    60 }
    61 
    62 int main()
    63 {
    64     return 0;
    65 }

    未测试版本

  • 相关阅读:
    MySQL初始化以及更改密码
    对付小白的ARP的简单介绍
    PXE批量安装CentOS7操作系统
    20不惑
    辩论会
    学习
    JAVA语言的特点
    程序流程图对新手来说很重要。
    浅谈博客、微博与轻博客的区别与联系
    要学好JAVA要注意些什么?
  • 原文地址:https://www.cnblogs.com/cane/p/3867477.html
Copyright © 2011-2022 走看看