整数中1出现的次数(从1到n整数中1出现的次数)
求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
解题思路
判断1~n上每个数的1的个数;通过取余整除的方式求出1的个数
代码
/**
* 剑指offer一刷:整数中1出现的次数(从1到n整数中1出现的次数)
*
* @author User
* @create 2019-05-25-18:52
*/
public class jzo31 {
public int NumberOf1Between1AndN_Solution(int n) {
if (n<1){
return 0;
}
int count=0;
for (int i=0;i!=n+1;i++){
count+=getNums(i);
}
return count;
}
public int getNums(int num){
int res=0;
while (num!=0){
if (num==1){ //取余
res++;
}
num/=10; //整除
}
return res;
}
public static void main(String[] args){
int n=13;
jzo31 so=new jzo31();
System.out.println(so.NumberOf1Between1AndN_Solution(n));
}
}
把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路
重写了Arrays的compare的方法(Collections中的sort也是调用的Arrays中的compare方法),对三个数进行了排序;
代码
import java.util.*;
/**
* 剑指offer一刷:把数组排成最小的数
*
* @author User
* @create 2019-05-25-19:33
*/
public class jzo32 {
public String PrintMinNumber(int [] numbers) {
if (numbers==null||numbers.length==0){
return "";
}
int len=numbers.length;
String[] str=new String[len];
StringBuilder StrB=new StringBuilder();
for (int i=0;i<len;i++){
str[i]=String.valueOf(numbers[i]);
}
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
String s1=o1+o2;
String s2=o2+o1;
return s1.compareTo(s2);
}
});
for (int i=0;i<len;i++){
StrB.append(str[i]);
}
return StrB.toString();
}
public String PrintMinNumber1(int [] numbers) {
int n;
String s="";
ArrayList<Integer> list=new ArrayList<>();
n=numbers.length;
for (int i=0;i<n;i++){
list.add(numbers[i]);
}
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
String s1=o1+""+o2;
String s2=o2+""+o1;
return s1.compareTo(s2);
}
});
for(int j:list){
s+=j;
}
return s;
}
public static void main(String[] args){
int[] n={2,31,321};
jzo32 so=new jzo32();
System.out.println(so.PrintMinNumber(n));
System.out.println(so.PrintMinNumber1(n));
}
}