剑指offer-第五章优化时间和空间效率(从1到n的整数中1出现的次数)
题目:输入一个整数n,从1到n这n个十进制整数中1出现的次数。
思路1:对1到n中的任意一个数i对其进行求余数来判断个位是否为1,然后再求除数,判断十位是否为1.统计出1的个数。然后对1到n用一个循环将所有的数都加起来。时间复杂度为O(nlogn).
思路2:根据数字的规律来求。例如:21344这个数,我们将它分成两部分,第一部分为1345~21344.这部分我们可以先求出最高位上一出现的次数。又分为两种情况,10000~19999这种情况下最高位大于1,1出现的次数为10^4,另一种是10000~13456.1出现的次数为3456+1。第二部分为1~1344。采用递归完成。这种思路时间复杂度为O(logN)。
思路1:Java代码
//从1到n个整数中1出现的次数。时间复杂度为O(nlogn)
public class NumberOf1 {
public int number(int n){
int number=0;
for(int i=1;i<=n;i++){
number+=numberOf1(i);
}
return number;
} public int numberOf1(int n) {
int number=0;
while(n!=0){
if(n%10==1)
number++;
n/=10;
}
return number;
}
public static void main(String[] args){
int n=213;
NumberOf1 no1=new NumberOf1();
int number=no1.number(n);
System.out.println(number);
}
}
思路2:Java代码
//从1到n的整数中,1出现的次数。从数字规律着手提高时间效率例如数字21456
//我们可以把该数字分为两部分,一部分是1到1456,另一不部分为1457到21456.
//首先看一下最高位为1的情况,分为两种,第一种10000到19999,最高位为1的数总共有10^4个。
//第二种10000到12345,那么就是23456个了。我们接下来看一下排列组合剩下的四为数中出现1
//的次数最高位为2,剩下四位中有一位为1,其他的三位符合排列组合0到9中任选一位,总和就是2*4*10^3。
//这种思路,每次做递归的时候就去掉一位,一个数字n有logN位。因此时间复杂度为O(logN)
public class NumberOf1BetweenN {
public int numberOf1(int n){
if(n<=0)
return 0;
String number=String.valueOf(n);
char[] numbers=number.toCharArray();
return numberOf1BetweenN(numbers,0);
} public int numberOf1BetweenN(char[] numbers, int i) {
if(numbers==null||i>numbers.length||i<0)
return 0;
//处理的第一个数字
int first=numbers[i]-'0';
int firstNumber=0;
//处理的数字的位数
int len=numbers.length-i;
//当只有一位数的时候
if(len==1&&first==0)
return 0;
if(len==1&&first>0)
return 1;
if(first>1){
firstNumber=powerBase10(len-1);
}
else if(first==1)
firstNumber=autoi(numbers,i+1)+1;
//处理剩下的位数
int otherNumber=first*(len-1)*powerBase10(len-2);
//处理1到1456这部分数字
int reverseNumber=numberOf1BetweenN(numbers,i+1);
return firstNumber+otherNumber+reverseNumber;
}
//将字符串数组转换为数字
public int autoi(char[] numbers, int i) {
if(numbers==null)
return 0;
int result=0;
for(int j=i;j<numbers.length;j++){
result=result*10+numbers[j]-'0';
}
return result;
} public int powerBase10(int n) {
int result=1;
for(int j=0;j<n;j++){
result*=10;
}
return result;
}
public static void main(String[] args){
int n=213;
NumberOf1BetweenN nobn=new NumberOf1BetweenN();
int numbersOf1=nobn.numberOf1(n);
System.out.println(numbersOf1);
}
}
剑指offer-第五章优化时间和空间效率(从1到n的整数中1出现的次数)的更多相关文章
- 剑指offer-第五章优化时间和空间效率(数组中的逆序对的总数)
题目:在数组中如果两个数字的前面的数比后面的数大,则称为一对逆序对.输入一个数组求出数组中逆序对的总数. 以空间换时间:思路:借助一个辅助数组,将原来的数组复制到该数组中.然后将该数组分成子数组,然后 ...
- 剑指offer-第五章优化时间和空间效率(数组中出现次数超过一半的数字)
题目:输入一个数组,找出一个数字,它在数组中出现的次数超过数组的一半. 题目规定如果可以改变数组中元素的位置. 思路1:如果数组是排序的,那么中间元素的位置不就是次数超过数组一半的元素吗?是的,因此我 ...
- 剑指offer-第五章优化时间和空间效率(把数组排列成最小的数)
题目:输入一个正整数数组,将所有的数,排列起来,组成一个最小的数.
- 剑指offer-第五章优化时间和空间效率(两个链表的第一个公共节点)
思路1:要求的是两个链表的第一个公共节点,首先想到的是用栈来存放两个链表,然后依次从栈中抛出,直到最后一个相同的节点为止.但是要用到两个栈,空间复杂度为O(n): 思路2:从头到尾分别遍历两个链表得到 ...
- 剑指offer-第五章优化时间和空间效率(在字符串中第一次出现切只出现一次的字符)
题目:在字符串中第一次出现切只出现一次的字符 思路:用HashMap来存放对应的char值和该char出现的次数.做一次变量就可以得到第一个只出现一次的字符. Java代码: import java. ...
- 剑指offer-第五章优化时间和空间效率(连续子数组的最大和)
题目:输入一个数组,数组中有正也有负,数组中连续的一个或者连续的多个数字组成一个子数组.求所有的子数组和的最大值.要求时间复杂度为O(n) 思路:我们的最直观的想法就是求出这个数组中的所有的子数组,然 ...
- 剑指offer-第五章优化时间和空间效率(最小的k个数)
题目:输入n个数,输出最小的k个数. 时间复杂度为O(n) 思路1:我们想的到的最直接的思路就是对这个N个数进行排序,然后就可以找到最小的k个了,同样可以用快排partition.但是只要找到前K个最 ...
- 剑指offer第五章
剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...
- 剑指offer-第5章优化时间和空间效率(丑数)
题目:我们把只包含因子2,3,5的数叫做丑数.寻找第1500个丑数.通常把1当成第一个丑数. 思路1:第一步判断是否为丑数:丑数是只包含2,3,5的数,因此一定可以被2,3,5整除.通过求余数是否为零 ...
随机推荐
- jQuery UI 自定义样式的日历控件
在线演示 本地下载
- Python多类继承中,子类默认继承哪个父类的构造函数__init__
[1]python中如果子类有自己的构造函数,不会自动调用父类的构造函数,如果需要用到父类的构造函数,则需要在子类的构造函数中显式的调用. [2]如果子类没有自己的构造函数,则会直接从父类继承构造函数 ...
- Maven:Eclipse上Maven的配置
Eclipse上Maven的配置: 步骤: ①Maven下载地址: http://maven.apache.org/download.cgi# ②解压apache-maven-3.5.0-bin.zi ...
- 关于阿里云Symantec免费DV证书部署HTTPS
获取阿里云Symantec免费DV证书: 官方文件说明: 证书文件214188487290026.pem,包含两段内容,请不要删除任何一段内容. 如果是证书系统创建的CSR,还包含:证书私钥文件214 ...
- Linux集群的NTP服务器时间同步
我们搭建集群环境的时候,时间必须是要统一的,才能保证集群数据的一致性. 一般操作是直接使用NTP,跟默认的时间服务器同步,但是最好还是让所有节点跟集群中的某台作为时间服务器的节点同步. 步骤:(节点有 ...
- django中Model表的反向查询
很多时候需要在多张表之间进行跨表查询,这其中外键是必须存在的,而通过外键所处的表的对象进行跨表查询, 称为正向查询.反之,则是反向查询. 正向查询很简单,这里不谈. 主要谈下反向查询. class U ...
- JQuery 全选 取消
$('#chkAllProp').click(function () { $("input[id*='chkSelect']").prop("checked", ...
- Ajax-04 jQuery Ajax 常用操作
jQuery jQuery 其实就是一个JavaScript的类库,其将复杂的功能做了上层封装,使得开发者可以在其基础上写更少的代码实现更多的功能. jQuery Ajax a.概述 jQuery 不 ...
- appium自动化测试(五)
1. 页面封装——理性判断 2. basepage——定位表达式的判断——要加上移动端的,加上上下左右滑动封装.toast可以封装.webview切换操作 3. 页面当中,所有元素定位——更换——移动 ...
- 51nod-1201-数位dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 1201 整数划分 基准时间限制:1 秒 空间限制:131072 ...