32. 从 1 到 n 整数中 k (0,1, 2, 3, 4, 5, 6, 7, 8, 9)出现的次数。  时间 O(log10N)

A. 当 K != 0 时:

n = 2014,K = 1 为例来找规律。从 1 至 2014 中,数字 1 总计出现了 次出现在十位, 次出现在百位,1000 次出现在千位。

分析:

首先是个位。从 1 至 2014 中,包含了 201 个 10,个位是 1 时,高位分别为 0 — 200。当高位为 201 时,因为  4 > K,出现 1 次 2011。故共出现 201 * 1 + 1 = 202 次。

然后是十位。从 1 至 2014 中,包含了 20 个 100,高位为 0 — 19 ,十位为 1 时,低位(个位)分别有10种情况。剩下的数字是从 2000 至 2014,它们的十位数字 1 = K,因此包含了 2010, 2011,2012,2013, 2014 共 5 个数。所以有 20 * 10 + 5 = 205 次。

接下来是百位。从 1 至 2000 中,包含了 2 个 1000,因此 K 出现了 2×100=200 次。剩下的数字是从 2000 至 2014,它们最大的百位数字 0 < K,所以高位为 20 时,百位不会出现 1 。因此共有 2 * 100 = 200 次。

最后是千位。此时高位是 0 一种情况,千位数字 。到此为止,已经计算出全部数字 1 的出现次数。

B. 当 K = 0 时:

高位是 0 的情况取消(想想为什么),如 2014,共有 516 次。其中个位 201 次,十位 200 次, 百位 115次, 千位 0 次。

#include <iostream>
using namespace std;
int numberOfK(int n, int k) // 10 > k >= 0
{
    int count = 0;
    int cur_pos = 1;
    int high, low;
    do
    {
        high = n / (cur_pos * 10);
        low = n % cur_pos;
        int cur_digit = n % (cur_pos * 10) / cur_pos;
        if(cur_digit < k)
            count += high * cur_pos;
        else{
            if(k == 0) --high;
            if(cur_digit == k)
                count += high * cur_pos + low + 1; // when high == 0, cur_digit must be the last number that is not 0.
            else
                count += high * cur_pos + cur_pos;
            if(k == 0) ++high;
        }
        cur_pos *= 10;
    }while(high > 0);
    return count;
}
int main()
{
    cout << numberOfK(101, 1) << endl;
    cout << numberOfK(101, 0) << endl;
    return 0;
}

33. 把正整数数组排成最小的数

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
#pragma warning(disable : 4996)
int cmp(const void *str1, const void *str2);
char combine1[21];   // length of int number is no more than 10
char combine2[21]; 

void getMinNumber(int data[], int length)
{
    if(data == NULL || length < 0) return;
    char **strData = new char*[length];
    for(int i = 0; i < length; ++i)
    {
        strData[i] = new char[11];
        sprintf(strData[i], "%d", data[i]);
    }
    qsort(strData, length, sizeof(char*), cmp);

    for(int i = 0; i < length; ++i)
        printf("%s", strData[i]);
    printf("\n");

    for(int i = 0; i < length; ++i)
        delete[] strData[i];
    delete[] strData;
}

int cmp(const void *str1, const void *str2)
{
    strcpy(combine1, *(const char**)str1);
    strcpy(combine2, *(const char**)str2);
    strcat(combine1, *(const char**)str2);
    strcat(combine2, *(const char**)str1);
    return strcmp(combine1, combine2);
}

int main()
{
    int data[] = {3, 2, 1, 6, 5, 4, 9, 8, 7, 10};
    getMinNumber(data, 10);

    return 0;
}

34. 丑数

丑数:只包含因子 2、3 和 5 的数。习惯把 1 作为第一个丑数。

找出第 n 个丑数。 如 n = 1500.

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
const int N = 1000000;
int uglyNumber[N] = {1};
int min(int a, int b, int c)
{
    a = a > b ? b : a;
    a = a > c ? c : a;
    return a;
}
void getUglyNumber(int N)
{
     int t2, t3, t5, cnt = 1;
     t2 = t3 = t5 = 1;
     while(cnt < N)
     {
         uglyNumber[cnt] = min(t2*2, t3*3, t5*5);
         while(t2*2 <= uglyNumber[cnt]) ++t2;
         while(t3*3 <= uglyNumber[cnt]) ++t3;
         while(t5*5 <= uglyNumber[cnt]) ++t5;
         ++cnt;
     }
}
int main()
{
    int k;
    getUglyNumber(N);
    while(true)
    {
        cin >> k;
        if(k < N)
            cout << uglyNumber[k] << endl;
    }
    return 0;
}

Chap5:32– 34的更多相关文章

  1. 【故障•监听】TNS-12518、TNS-00517和 Linux Error:32:Broken pipe

    [故障|监听]TNS-12518.TNS-00517和 Linux Error:32:Broken pipe 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱 ...

  2. ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构

    ★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...

  3. Linux:32/64位程序(应用程序、共享库、内核模块)

    摘要: Linux系统区分32/64位,相应地,应用程序.共享库和内核模块也区分32/64位. 本文以Ubuntu系统为例,介绍如何编译和使用32/64位的应用程序.共享库和内核模块. 1. 应用程序 ...

  4. 在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值)

    原文:在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. sql循环取差值,该怎 ...

  5. TNS-12518 &amp; Linux Error:32:Broken pipe

    最近一周,有一台ORACLE数据库服务器的监听服务在凌晨2点过几分的时间点突然崩溃,以前从没有出现过此类情况,但是最近一周出现了两次这种情况,检查时发现了如下一些信息: $ lsnrctl servi ...

  6. 初级模拟电路:3-2 BJT的工作原理

    回到目录 和前面介绍二极管的PN结的工作原理一样,BJT的量子级工作机制也非常复杂,一般教科书上为了帮助学习者能快速理解,也都是用一种简化模型的方法来介绍BJT的工作机理,一般只需大致了解即可.只要记 ...

  7. 剑指Offer面试题:32.数字在排序数组中出现的次数

    一.题目:数字在排序数组中出现的次数 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 二.解题思路 2 ...

  8. Effective C++:规定34:区分接口继承和实现继承

    (一个) class Shape { public: virtual void draw() const = 0; virtual void error(const string& msg); ...

  9. Effective C++ 笔记:条款 34 实现继承和接口继承

    Differentiate between inheritance of interface and inheritance of implementation. 行为含义 声明一个pure virt ...

随机推荐

  1. centos下MYSQL 没有ROOT用户的解决方法。

    SbTest for using sysbench creating scritps: sysbench --test=oltp --oltp-table-size=100000 --mysql-db ...

  2. C++设计模式-Prototype原型模式

    作用: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone), Clone()实现和具体的语言相关,在C+ ...

  3. iOS 开发-- enum与typeof enum用法

    一, 两者的用法 枚举类型定义用关键字enum标识,形式为: enum标识符 { 枚举数据表 }; enum用来定义一系列宏定义常量区别用,相当于一系列的#define ** **,当然它后面的标识符 ...

  4. Mac OS X上尝试编译CoreCLR源代码

    CoreCLR登陆GitHub之后,体验CoreCLR首当其冲的方式就是在自己的电脑上编译它,昨天分别在Windows与Linux上成功编译了CoreCLR,详见: 1)Windows上成功编译Cor ...

  5. hdu 4000 Fruit Ninja 树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4000 Recently, dobby is addicted in the Fruit Ninja. ...

  6. Runnable、Callable、Future和FutureTask用法

    http://www.cnblogs.com/dolphin0520/p/3949310.html java 1.5以前创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable ...

  7. li样式不显示使用overflow:hidden导致Li前面点、圈等样式不见

    点评:用了overflow:hidden 会影响 list-style,即当ul 中的li 的overflow 为hidden的时候,list-style不起作用,不显示前面的点.圈等样式,在ul或l ...

  8. windows2003网络负载平衡设置

    问题 随着计算机技术的不断发展,单台计算机的性能和可靠性越来越高.但现实中还是有许多应用是单台计算机难以达到,例如: 1.银行存储用户数据的数据库服务器必须保证24小时不间断的运转,并在发生严重硬件故 ...

  9. Android如何监听蓝牙耳机的按键事件

    写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「Bluedio + 红米手机」. 1.蓝牙耳机的 ...

  10. 在code first结构下的生成的数据迁移文件,upadate-database失败

    程序控制台出现 already exist Table "xxx",是由于项目中的Migrations(迁移文件)与连接的mysql数据库里迁移记录表里的数量及名称不一致.