• 面试题: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 }

    未测试版本

  • 相关阅读:
    第二次Java作业2
    5月29日打卡
    5月24号打卡
    5月22日打卡
    窗口的切换
    第三次作业
    第五次实训作业
    第二次Java作业
    无法解析的外部符号之_cvLoadImage,_cvCreateMat,_cvReleaseImage之类
    无法解析的外部符号"void_cdecl caffe::caffe_gpu_dot<double>(int,double........)"
  • 原文地址:https://www.cnblogs.com/cane/p/3867477.html
Copyright © 2020-2023  润新知