Start from integer 1, remove any integer that contains 9 such as 9, 19, 29...
So now, you will have a new integer sequence: 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, ...
Given a positive integer n
, you need to return the n-th integer after removing. Note that 1 will be the first integer.
Example 1:
Input: 9 Output: 10
Hint: n will not exceed 9 x 10^8
.
直接求出这个数的九进制不就好了?(二进制的数不出现2,...同理九进制的数也不会出现9)从1开始到第n个数,碰到8就跳到10,碰到18就跳到20,碰到88就跳到100,这不就类似于九进制的进位吗。因此第n个数,只要求n的九进制如何表示就好了。
//将十进制数n 转化为九进制数
public int newInteger(int n) {
int result=0;
int base=1;
while(n>0){
result=result+ n%9 * base;
base=base*10;
n=n/9;
}
return result;
}
大神思路跟我一样,然后用的是java自带的转化进制方法:
public int newInteger(int n) {
return Integer.parseInt(Integer.toString(n, 9));
}
大神解释如下:十进制的序列: 1, 2, 3, 4, ... 如果把所有不包含 9 的数都排除在外,那么剩下可以用的数字就是 0~8 ,因此可以用九进制来做,因此九进制的序列包含了使用 0~8 来组成数字的所有可能性,而且保证数字序列 are in ascending order and increment by one 。
有人提出了疑问:如果题目中把 remove 9 换成 remove 7,又如何做呢?https://discuss.leetcode.com/topic/99244/what-if-remove-number-7 。因为题目比较新所以还没有多少人回答,不过可以持续关注一下这个topic.
有人回答说:I think remove 7 is same as remove 9 with mapping 7->8, 8->9. For example, you get answer as 18317 and the final answer would be 19318. 不知道这个思路对不对哎,我试了几个例子好像都可以?