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 总计出现了 1607 次,其中有 202 次出现在个位, 次出现在十位, 次出现在百位,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 一种情况,千位数字 2 > K,所以千位是 K 的情况有 1 * 1000 = 。到此为止,已经计算出全部数字 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. SQL基础教程(第2版)第3章 聚合与排序:3-2 对表进行分组

    第3章 聚合与排序:3-2 对表进行分组 ● 使用GROUP BY子句可以像切蛋糕那样将表分割.通过使用聚合函数和GROUP BY子句,可以根据“商品种类”或者“登记日期”等将表分割后再进行汇总.● ...

  6. TNS-12518 & Linux Error:32:Broken pipe

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

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

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

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

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

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

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

随机推荐

  1. 《算法竞赛入门经典》5.41数学基础-Cantor的数表

    如下数列,第一项是1/1,第二项是1/2,第三项是2/1,第四项是3/1,第五项是2/2,…….输入n,输出第n项.1/1   1/2   1/3   1/4   1/52/1   2/2   2/3 ...

  2. jetty启动不能保存

    主要原因是jetty缓存的静态页面不能被修改.只需要在web.xml文件中配置如下: <servlet>    <!-- Override init parameter to avo ...

  3. app转让遇到的坑

    家人共享的一部分 首先我们要符合app转让的一些基本规定,填写正确的信息去申请转让.(google会有很多正确的转让步骤),这里我就不多写出来了. 当接收到接受app的时候会出现一些想不到的问题. 其 ...

  4. uoot启动过程

    1.从我们的start_armboot开始讲起 u-boot整体由汇编段和C语言段外加连接脚本组成.关于汇编段请看我之前的博客<u-boot源码汇编段简要分析>,好,让我们进入start_ ...

  5. Manacher

    HDU 3068 Manacher裸题 #include <cstdio> #include <cstring> ; ],STR[Maxn<<]; ],Id,Mx; ...

  6. system_call的处理过程

    一. 跟踪time系统调用 使用gdb调试跟踪系统调用内核函数sys_time 过程如下: 对sys_time设置断点之后,在menuOS中执行time命令,发现系统停在systime处,输入S单步执 ...

  7. 从零开始学习Node.js例子一 http get和post

    httpserverrequestget.js /* 获取GET请求内容 由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数 ...

  8. iOS 常用设计模式和机制之KVO

    KVO http://blog.kyleduo.com/2014/10/20/ios_learning-kvo/ 定义: KVO:Key-Value Observing,是Foundation框架提供 ...

  9. Jenkins Job 自杀 groovy

    下面的groovy可以加在post groovy script里面在job跑完的时候自杀(把本Job删掉) suicide_url="http://[USER]:[PASSWORD]@[JE ...

  10. RelativeLayout.LayoutParams.addRule()方法

    1.应用场景 在使用RelativeLayout布局的时候,通常在载入布局之前在相关的XML文件中进行静态设置即可.但是,在有些情况下,我们需要动态的设置布局 的属性,在不同条件下设置不同的布局排列方 ...