剑指Offer题目JAVA版思路与代码(九)
来源:互联网 发布:东邪西毒 欧阳锋 知乎 编辑:程序博客网 时间:2024/05/22 13:46
第三十二题:把数组排成最小的数
题目描述:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:
可以给出一个新的定义:两个数a、b,如果ab>ba,则定义a大于b,反之,则a小于b;根据此定义将数组中的所有数从小到大排序,然后依序组合成的数字就是最小数字。
代码:
import java.util.ArrayList;import java.util.*;public class Solution { public String PrintMinNumber(int [] numbers) { String result = ""; ArrayList<String> ret = new ArrayList<String>(); if(numbers == null || numbers.length == 0){ return result; } for (int i = 0; i < numbers.length; i++) { ret.add(String.valueOf(numbers[i])); } Collections.sort(ret, new Comparator<String>(){ public int compare(String str1, String str2){ String s1 = str1+str2; String s2 = str2+str1; return s1.compareTo(s2); } }); for(int i = 0; i<ret.size(); i++) { result += ret.get(i); } return result; }}
第三十三题:丑数
题目描述:
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路:
首先,要正确地理解丑数的定义,他的因子中除了1和本身之外就只能有2或3或5,除此之外的因子出现就不算是丑数。
其次,如果思路是:将1到n每个数字根据定义判断是不是丑数,然后一直判断到出现第n个丑数,这样的做法未免太过于耗时,做了不少无用功。所以有效的做法是:假设已有一个数组是一组丑数,数组最后一个丑数是u,则要知道下一个丑数的话,直接计算会快很多。取三个指针,分别指向数组中的a、b、c,使得2a大于u,3b大于u,5c大于u;然后只要比较2a,3b,5c的大小,取最小的那个就是数组下一个丑数。至于三个指针的选取,以为是数组是依次计算得到的,所以指针开始都是之前第一个数1,随着计算的进行一步步推进即可。
代码:
public class Solution { public int GetUglyNumber_Solution(int index) { if(index <= 0){ return 0; } int[] uglynumbers = new int[index]; uglynumbers[0] = 1; int nextuglyindex = 1; int m2 = 0; int m3 = 0; int m5 = 0; while (nextuglyindex<index){ int nextnum = Min(uglynumbers[m2]*2, uglynumbers[m3]*3, uglynumbers[m5]*5); uglynumbers[nextuglyindex] = nextnum; while(uglynumbers[m2]*2 <= nextnum){ m2++; } while(uglynumbers[m3]*3 <= nextnum) { m3++; } while(uglynumbers[m5]*5 <= nextnum) { m5++; } nextuglyindex++; } return uglynumbers[index-1]; } public int Min(int n1, int n2, int n3) { int min = (n1 < n2 ? n1 : n2); min = (min < n3 ? min : n3); return min; }}
第三十四题:第一次只出现一次的字符
题目描述:
在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置。
思路:
需要一个长度为256的数组,初始化为0。然后扫描字符串,以字符的ASCII码最为数组的下标,存储出现的次数。之后第二次扫描该字符串,找到hash表中对应字符出现的次数是否为1。为1则输出数组中对应的位置i。
代码:
public class Solution { public int FirstNotRepeatingChar(String str) { if (str == null || str.length() == 0){ return -1; } int[] helper = new int[256]; for (int i = 0; i < 256; i++) { helper[i] = 0; } for (int i = 0; i < str.length(); i++) { helper[str.charAt(i)-'0'] += 1; } int ret = -1; for (int i = 0; i < str.length(); i++) { if (helper[str.charAt(i)-'0'] == 1){ ret = i; break; } } return ret; }}
- 剑指Offer题目JAVA版思路与代码(九)
- 剑指Offer题目JAVA版思路与代码(一)
- 剑指Offer题目JAVA版思路与代码(二)
- 剑指Offer题目JAVA版思路与代码(三)
- 剑指Offer题目JAVA版思路与代码(四)
- 剑指Offer题目JAVA版思路与代码(五)
- 剑指Offer题目JAVA版思路与代码(六)
- 剑指Offer题目JAVA版思路与代码(七)
- 剑指Offer题目JAVA版思路与代码(八)
- 剑指Offer题目总结(java版)
- 【九度-剑指Offer题目笔记】上
- 【九度-剑指Offer题目笔记】下
- 【剑指offer】Java版代码(完整版)
- 剑指offer题目java实现
- 九度OJ-剑指offer-题目1385:重建二叉树
- 九度oj-剑指offer-题目1510:替换空格
- [九度OnlineJudge][剑指Offer]题目1510:替换空格
- [九度OnlineJudge][剑指Offer]题目1389:变态跳台阶
- 集群数据迁移
- 数据仓库的基本架构
- [LeetCode]35 Search Insert Position
- 有序数组合并
- 409. Longest Palindrome
- 剑指Offer题目JAVA版思路与代码(九)
- hashCode与equals的区别与联系
- 1017. A除以B,第二个测试点始终过不去
- jQuery学习 四 jQuery jQuery 遍历
- Java 命令行运行参数大全
- Trafodion事务管理简述
- 常用的正则表达式
- 如何使用python写一个操作系统
- http://www.cnblogs.com/xingyukun/archive/2007/10/20/931331.html