剑指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整除.通过求余数是否为零 ...
随机推荐
- Android平台Camera实时滤镜实现方法探讨(三)--通过Shader实现YUV转换RBG
http://blog.csdn.net/oshunz/article/details/50055057 文章例如该链接通过将YUV分成三个纹理,在shader中取出并且经过公式变换,转换成RGB.我 ...
- MySQL-5.7 高阶语法及流程控制
1.标签语句 [begin_label:] BEGIN [statement_list] END [end_label] [begin_label:] LOOP statement_list END ...
- Python3:Django根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'
Python3:Django根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete' 一.分析 在 ...
- OpenVpn部署使用easy-rsa-3.0
OpenVpn简介 OpenVPN是一个用于创建虚拟专用网络(Virtual Private Network加密通道的免费开源软件.使用OpenVPN可以方便地在家庭.办公场所.住宿酒店等不同网络访问 ...
- uitableview 侧滑删除
https://github.com/MortimerGoro/MGSwipeTableCell
- sql server 数据库复制实现数据同步常见问题(不定期更新)
sql server2008数据库复制实现数据同步常见问题 在原作者基础上追加 sql server2008数据库复制实现数据同步常见问题 23.发布 'xx' 的并发快照不可用,因为该快照尚未完全生 ...
- Spring注解(事务)
spring操作数据库 jdbc <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> & ...
- Contest-hunter 暑假送温暖 SRM01
一直找不到好的题去做...于是想到了srm...回来补题...QAQ 从srm01补起 A 题意:n个数,排成一列,刚开始都是1,如果左右相等就可以合并,问最后的数列长什么样. 思路:比赛的时候直接敲 ...
- webstorm打开带有node_modules文件夹的工程时很卡
ctrl+alt+s打开settings 在webstorm中配置这个就可以不加载出来node_modules使页面加载快
- 安装Charles报错
去年用的是charles4.1.2版本,今年这个版本的安装包始终安装报错,不管公司电脑还是自己电脑........ 我的解决方案很Lower的.......... 登录Charles官网:https: ...