Google – Generate All Numbers in Range
给两个string a和b表示两个数,输出a和b之间所有的数。假设a对应位的digit都小于等于b。
比如a = 123, b = 234, 或者a = 123, b = 2123.
a = 99, b = 100这样的就不行。
[Solution]
看着就像backtracking题。不过这题backtracking还得分情况考虑:
[Note]
这道题用string也就是防止overflow,其实如果输入两个integer,backtracking和直接用for loop遍历的复杂度是一样的。
Read full article from Google – Generate All Numbers in Range
给两个string a和b表示两个数,输出a和b之间所有的数。假设a对应位的digit都小于等于b。
比如a = 123, b = 234, 或者a = 123, b = 2123.
a = 99, b = 100这样的就不行。
[Solution]
看着就像backtracking题。不过这题backtracking还得分情况考虑:
- 如果sb[i – 1] == a[i – 1],那么当前level从a[i]开始,否则从0开始。
- 如果sb[i – 1] == b[i – 1],那么当前level到b[i]结束,否则到9结束。
[Note]
这道题用string也就是防止overflow,其实如果输入两个integer,backtracking和直接用for loop遍历的复杂度是一样的。
public List<String> allNumbers(String a, String b) { List<String> result = new ArrayList<>(); while (a.length() < b.length()) { a = "0" + a; } backtracking(a, b, 0, result, new StringBuilder()); return result; } private void backtracking(String a, String b, int pos, List<String> result, StringBuilder sb) { if (pos == a.length()) { result.add(sb.toString()); return; } int i = 0; if (pos == 0 || sb.charAt(pos - 1) == a.charAt(pos - 1)) { i = a.charAt(pos) - '0'; } int j = 9; if (pos == 0 || sb.charAt(pos - 1) == b.charAt(pos - 1)) { j = b.charAt(pos) - '0'; } while (i <= j) { sb.append(i); if (i < j) { backtracking(a, b, pos + 1, result, sb); } else { backtracking(a, b, pos + 1, result, sb); } sb.deleteCharAt(sb.length() - 1); i++; } }