《剑指offer》算法题第九天
今日题目:
- 整数中1出现的次数
- 把数组排成最小的数
- 丑数
- 第一个只出现一次的字符位置
今天的题目相对比较难,特别是第1题和第3题很考验数学功底,下面我们一题一题来看看。
1.整数中1出现的次数
题目描述:
输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1的数字有1,10,11,和12,1一共出现了5次。 思路:
这道题分别有递归和迭代两种解法,第一次看见这个题目比较难想到,可参考:
递归:http://blog.csdn.net/gatieme/article/details/51292339
代码如下:
//递归
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
if(n == 0) return 0;
else if(n > 0 && n < 10) return 1;
else{
int high = n;
int weight = 1;
while(high >= 10){
high /= 10;
weight *= 10;
} if(high == 1){
return NumberOf1Between1AndN_Solution(weight-1)+
NumberOf1Between1AndN_Solution(n-weight)+
(n - weight + 1);
}else{
return high*NumberOf1Between1AndN_Solution(weight-1)+
NumberOf1Between1AndN_Solution(n - high*weight)+
weight;
} }
}
} //迭代
public class Solution {
int NumberOf1Between1AndN_Solution(int n){
int ones = 0;
for (int m = 1; m <= n; m *= 10) {
int a = n/m, b = n%m;
if(a%10 == 0)
ones += a / 10 * m;
else if(a%10 == 1)
ones += (a/10*m) + (b+1);
else
ones += (a/10+1)* m;
}
return ones;
}
}
2.把数组排成最小的数
题目描述:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 思路:
重新定义一种比较方法,然后对数组进行排序,最后再输出,博主这边是维护了一个最小堆。
代码如下:
public class Solution {
public String PrintMinNumber(int [] numbers) {
PriorityQueue<String> minHeap = new PriorityQueue(new Comparator<String>(){
public int compare(String str1,String str2){
String str_12 = str1+str2;
String str_21 = str2+str1;
return str_12.compareTo(str_21);
}
});
for(int n:numbers){
minHeap.add(""+n);
}
StringBuffer sb = new StringBuffer();
while(!minHeap.isEmpty()){
sb.append(minHeap.poll());
}
return sb.toString();
}
}
3. 丑数
题目描述:
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 思路:
由丑数的定义,每个丑数都是可以由比他小的丑数乘以2,3,或者5得到的,所以这边维护了一个数组和三个分别指向下一步将乘以2,3,或者5的数的指针,这样方便来求解下一个丑数,减小时间复杂度。
代码如下:
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index <= 0) return 0;
int[] ugly_nums = new int[index];
ugly_nums[0] = 1;
int next = 1;
int p2 = 0,p3 = 0,p5 = 0;
while(next < index){
//找到下一个丑数
int min = Min(ugly_nums[p2]*2,
ugly_nums[p3]*3,ugly_nums[p5]*5);
ugly_nums[next] = min;
//移动指针,将它们指向下一个该乘的数
while(ugly_nums[p2]*2 <= ugly_nums[next])
p2++;
while(ugly_nums[p3]*3 <= ugly_nums[next])
p3++;
while(ugly_nums[p5]*5 <= ugly_nums[next])
p5++;
next++;
}
return ugly_nums[next-1];
}
public int Min(int num1,int num2,int num3){
int min = (num1 > num2)?num2:num1;
return min<num3?min:num3;
}
}
4.第一个只出现一次的字符位置
题目描述:
在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置。 思路:
比较简单,维护一个hashmap,将字符和出现的次数放入表中。
代码如下:
import java.util.*;
public class Solution {
public int FirstNotRepeatingChar(String str) {
if(str.length() <= 0) return -1;
HashMap<Character,Integer> map = new HashMap();
for(int i = 0; i < str.length(); i++){
char c = str.charAt(i);
if(!map.containsKey(c)){
map.put(c,1);
}else{
int val = map.get(c);
map.put(c,val+1);
}
}
for(int i = 0; i < str.length(); i++){
if(map.get(str.charAt(i)) == 1)
return i;
}
return -1; }
}
《剑指offer》算法题第九天的更多相关文章
- 剑指offer算法题
数组中只出现一次的数字(一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字): 解法在于位运算中的异或,直接异或可以得到这两个数的异或,按照最后的有效数字位可以 ...
- 剑指offer算法总结
剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行 ...
- 剑指Offer——算法复杂度中的O(logN)底数是多少
剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...
- 剑指 offer 第一题: 二维数组中的查找
打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣
- 剑指Offer编程题2——替换空格
剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...
- 剑指Offer编程题1——二维数组中的查找
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...
- 剑指offer编程题66道题 36-66
36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...
- 牛客网剑指offer刷题总结
二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...
- LeetCode剑指Offer刷题总结(一)
LeetCode过程中值得反思的细节 以下题号均指LeetCode剑指offer题库中的题号 本文章将每周定期更新,当内容达到10题左右时将会开下一节. 二维数组越界问题04 public stati ...
- 剑指offer编程题Java实现——面试题11数值的整数次方
题目: 实现函数double power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...
随机推荐
- Scala学习十——特质
一.本章要点 类可以实现任意数量的特质 特质可以要求实现它们的类具备特定的字段,方法或超类 和Java接口不同,Scala特质可以提供方法和字段实现 当你将多个特质叠加在一起时,顺序很重要——其方法先 ...
- winfrom 界面时间动态加载
Timer time1 = new Timer(); private void time1_Tick(object sender, EventArgs e) { lTime.Text = DateTi ...
- js gridview中checkbox的全选与全不选
1.html: <asp:GridView runat="server" ID="gvAddBySR" AutoGenerateColumns=" ...
- TCP/IP协议栈各个层次及分别的功能
网络接口层:这是协议栈的最低层,对应OSI的物理层和数据链路层,主要完成数据帧的实际发送和接收.网络层:处理分组在网络中的活动,例如路由选择和转发等,这一层主要包括IP协议.ARP.ICMP协议等.传 ...
- O042、Live Migrate 操作
参考https://www.cnblogs.com/CloudMan6/p/5554549.html Migrate 操作会先将Instance停掉,也就是所谓的 冷迁移 .而 Live Migr ...
- MyBatis-plus 新增实例,主键ID从很大的数字开始
mybatis-plus是mybatis增强版,用mybatis-plus可以省去很多DAO层代码和数据库操作语句的编写.但是需要我们配置好条件. 情景: 向数据库新增一条实例,我们要调用 inser ...
- 关于Webpack打包报错Class constructor FileManager cannot be invoked without 'new'
前端代码部署一直是自己打包之后将文件用FileZilla上传到服务器上,现在改用运维基于到k8s docker镜像的发布,前端打包报错如下: 经查资料,报错原因是less升级导致的Bug 尝试升级le ...
- Web框架理解
目录 1.web框架理解 2.http工作原理 3.通过函数实现浏览器和服务端通信案例 4.服务器程序和引用程序理解 5.jinja2渲染模板案例 6.Djan ...
- flex整页布局
使用flex进行整页的三列布局,flex:1下的子元素无法铺满父级.给flex:1元素,添加stretch拉伸 display: flex; align-content: stretch; align ...
- 实现单点登录功能的思路以及kafka同步数据
单点登录以及用户数据同步思路与方案 当公司业务分布于多个子系统时, 同一用户在A系统注册,即可在其他所有关联系统使用, 并支持登录A系统后,自动在其他系统登录,退出同理. 在A平台修改通用的用户数据( ...