今日题目:

  1. 整数中1出现的次数
  2. 把数组排成最小的数
  3. 丑数
  4. 第一个只出现一次的字符位置

今天的题目相对比较难,特别是第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》算法题第九天的更多相关文章

  1. 剑指offer算法题

    数组中只出现一次的数字(一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字): 解法在于位运算中的异或,直接异或可以得到这两个数的异或,按照最后的有效数字位可以 ...

  2. 剑指offer算法总结

    剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行 ...

  3. 剑指Offer——算法复杂度中的O(logN)底数是多少

    剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...

  4. 剑指 offer 第一题: 二维数组中的查找

    打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣

  5. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...

  6. 剑指Offer编程题1——二维数组中的查找

    剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...

  7. 剑指offer编程题66道题 36-66

    36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...

  8. 牛客网剑指offer刷题总结

    二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...

  9. LeetCode剑指Offer刷题总结(一)

    LeetCode过程中值得反思的细节 以下题号均指LeetCode剑指offer题库中的题号 本文章将每周定期更新,当内容达到10题左右时将会开下一节. 二维数组越界问题04 public stati ...

  10. 剑指offer编程题Java实现——面试题11数值的整数次方

    题目: 实现函数double power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...

随机推荐

  1. Codeforces Round #586 (Div. 1 + Div. 2) D.Alex and Julian 简单证明

    题意:在序列中删除最少元素使得得到的图是二分图. 其中点是整数域的点. 比如b1=2   那么a可以连b当且仅当|a-b|=2 同时这里的a,b是任意整数. 怎样判定一个序列是否合法呢?于是想到了二分 ...

  2. APOC官网触发器示例执行后Web页面一直转圈

    apoc使用触发器:如apoc官网指导 CREATE (d:Person {name:'Daniel'}) CREATE (l:Person {name:'Mary'}) CREATE (t:Pers ...

  3. C++中重载函数详解

    函数的重载详解 什么时函数重载: 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避 ...

  4. lua加载DLL

    .cpp //若没有在项目属性--库文件.依赖文件.包含添加.则添加一下路径 #pragma  comment (lib,"lua5.1.lib") #include " ...

  5. opencv 仿射变换 投射变换, 单应性矩阵

    仿射 estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变. getAffineTransform( ...

  6. 02 Go程序执行流程

    一.把源码编译成二进制后执行 .go代码源文件 => go build => 可执行文件(.exe文件或者linux二进制文件) => 运行结果 二.对源码直接运行 .go源代码文件 ...

  7. vue入门:(计算属性和侦听器)

    methods watch computed 一.methods-方法 在数据渲染是需要基于多个数据时第一种方法,可以采用methods属性中的方法计算返回值来实现,先来看示例: <div id ...

  8. 【漏洞分析】Discuz! X系列全版本后台SQL注入漏洞

    0x01漏洞描述 Discuz!X全版本存在SQL注入漏洞.漏洞产生的原因是source\admincp\admincp_setting.php在处理$settingnew['uc']['appid' ...

  9. 如何解决comctl32.dll文件丢失的问题?

    有些Win7系统用户在电脑开机时,系统会出现提示找不到comctl32.dll文件的情况,遇到这个问题我们该怎么去解决呢?好系统重装助手下面就来告诉你方法. Win7系统开机提示找不到comctl32 ...

  10. Raspberrypi 安装完MySQL之后登录不了(ERROR 1698 (28000))

    1.问题原因: 出现这是错误是因为 mysql 默认的 root 用户使用了 UNIX auth_socket_plugin 的用户认证方式,我们有下面两种方式处理问题: 修改 root 用户认证方式 ...