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. 为什么使用 Bootstrap?

    为什么使用 Bootstrap? 移动设备优先:自 Bootstrap 3 起,框架包含了贯穿于整个库的移动设备优先的样式. 浏览器支持:所有的主流浏览器都支持 Bootstrap.      容易上 ...

  2. WebStorm phpStorm 注册码

    WebStorm User or company Name: EMBRACE ===== LICENSE KEY===== 24718-12042010 00001h6wzKLpfo3gmjJ8xoT ...

  3. 由于@@ServerName等问题对SQL增量升级脚本进行补充

    由于@@ServerName在安装数据库之后修改了机器名的情况下,获取到的内容仍然是原来的机器名,造成数据库连接失败, 所以不能直接使用该全局变量. 此外对升级脚本的执行方式做了一下调整,将版本的判断 ...

  4. 实现Android4.4系统设置分页滑动浏览功能

    需求描述: 由于手机功能越来越完善,相应的偏好设置也就越来越多:从用户体验的角度考虑,为了让用户能够在短时间内对常用的偏好设置进行操作,如WIFI,蜂窝数据等.单独将一些常用的设置功能单独展示出来,已 ...

  5. 转 纯CSS设置Checkbox复选框控件的样式

    Checkbox复选框是一个可能每一个网站都在使用的HTML元素,但大多数人并不给它们设置样式,所以在绝大多数网站它们看起来是一样的.为什么不把你的网站中的Checkbox设置一个与众不同的样式,甚至 ...

  6. 基于GRPC+consul通信的服务化框架(转)

    原文:http://blog.csdn.net/yeyincai/article/details/51470475 -.背景 谈论服务化框架的时候,我们首先先了解这些概念:SOA.ESB.OSGi.s ...

  7. Js控制滚动条

    1>全局控制 //向上滑动显示 var initTop = 0; var i = 1; $(window).scroll(function(){ var scrollTop = $(docume ...

  8. Java和C/C++进行DES/AES密文传输(借鉴)

    Java和C/C++进行DES/AES密文传输 声明:对于新手来说很难解决的一个问题,终于在非常煎熬之后找到这篇文章,所以借鉴过来.原文地址http://blog.sina.com.cn/s/blog ...

  9. Flume 实战(1) -- 初体验

    前言: Flume-ng是数据收集/聚合/传输的组件, Flume-ng抛弃了Flume OG原本繁重的zookeeper和Master, Collector, 其整体的架构更加的简洁和明了. 其基础 ...

  10. C语言解决八皇后问题

    #include <stdio.h> #include <stdlib.h> /* this code is used to cope with the problem of ...