Problem 1:
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数).
Hint:
The ones' number on units digit:(n/10)*1 + (n%10)<1 ? 0 : (n%10 ≥ 2 ? 1 : (n%10-1)+1)
The ones' number on tens digit:(n/100)*10 + (n%100)<10 ? 0 : (n%100 ≥ 20 ? 10 : ( n%100-10)+1 )
The ones' number on hundreds digit:(n/1000)*100 + (n%1000)<100 ? 0 : (n%1000 ≥ 200 ? 100 : (n%1000-100)+1)
.
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
int count = 0;
int remainder = 0;
for (int i = 1; i <= n; i *= 10) {
count += (n / (i * 10) ) * i;
remainder = n % (i * 10);
if (remainder >= i) {
count += remainder >= 2 * i ? i : (remainder - i) + 1;
}
}
return count;
}
}
Problem 2:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
1.
import java.util.ArrayList;
public class Solution {
public String PrintMinNumber(int [] numbers) {
if (numbers == null || numbers.length == 0) {
return "";
}
for (int i = 0; i < numbers.length; i++) {
for (int j = i + 1; j < numbers.length; j++) {
int sum1 = Integer.valueOf(numbers[i] + "" + numbers[j]);
int sum2 = Integer.valueOf(numbers[j] + "" + numbers[i]);
if (sum2 < sum1) {
int temp = numbers[j];
numbers[j] = numbers[i];
numbers[i] = temp;
}
}
}
String str = new String("");
for (int i = 0; i < numbers.length; i++) {
str += numbers[i];
}
return str;
}
}
2. Simple but time consuming (167ms)
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public String PrintMinNumber(int [] numbers) {
if (numbers == null || numbers.length == 0) {
return "";
}
ArrayList<String> arr = new ArrayList<>();
for (int i : numbers) {
arr.add(i + "");
}
Collections.sort(arr, (o1, o2) -> (o1 + o2).compareTo(o2 + o1));
String s = "";
for (String j : arr) {
s += j;
}
return s;
}
}
3. custom comparator(19ms)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Solution {
public String PrintMinNumber(int [] numbers) {
if (numbers == null || numbers.length == 0) {
return "";
}
ArrayList<String> arr = new ArrayList<>();
for (int i : numbers) {
arr.add(i + "");
}
Collections.sort(arr, new Comparator<String>() {
public int compare(String o1, String o2) {
int i = 0; int j = 0;
while (i < o1.length() || j < o2.length()) {
if (i == o1.length()) i = 0;
if (j == o2.length()) j = 0;
if (o1.charAt(i) < o2.charAt(j)) {
return -1;
}
else if (o1.charAt(i) > o2.charAt(j)) {
return 1;
}
else {
i++; j++;
}
}
return 0;
}
});
String s = "";
for (String j : arr) {
s += j;
}
return s;
}
}
Problem 4:
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
public class Solution {
public int GetUglyNumber_Solution(int index) {
if (index == 0) {
return 0;
}
int p1 = 0, p2 = 0, p3 = 0;
int [] result = new int[index + 1];
result[0] = 1;
for (int i = 1; i < index; i++) { //generate Ugly Number
result[i] = Math.min(result[p1] * 2, Math.min(result[p2] * 3, result[p3] * 5));
if (result[i] == result[p1] * 2) p1++;
if (result[i] == result[p2] * 3) p2++;
if (result[i] == result[p3] * 5) p3++;
}
return result[index - 1];
}
}
Problem 5:
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
1.IndexOf() && lastIndexOf()
public class Solution {
public int FirstNotRepeatingChar(String str) {
if (str == null || str.length() == 0) {
return -1;
}
for (int i = 0; i < str.length(); i++) {
if (str.indexOf(str.charAt(i)) == str.lastIndexOf(str.charAt(i))) {
return i;
}
}
return -1;
}
}
2. count occurrence
public class Solution {
public int FirstNotRepeatingChar(String str) {
if (str == null || str.length() == 0) {
return -1;
}
int [] count = new int[200];
for (int i = 0; i < str.length(); i++) {
count[str.charAt(i)] += 1;
}
for (int i = 0; i < str.length(); i++) {
if (count[str.charAt(i)] == 1) {
return i;
}
}
return -1;
}
}