k*******t 发帖数: 144 | 1 给你26个字母,从A-Z, 用大小为26的数组letters存放。 input为一个integer,
output为一个string. 举例如下:
input->output
0 -> A
1 -> B
2 -> C
.......
25 -> Z
26 -> AA
27 -> AB
........
51 -> AZ
676 -> AAA
677 -> AAB
..........
我用的方法就是%, /. 但遇到比较tricky的问题就是最后当input为小于26时,我要减1
,再取对应的character. 比如: input为52, 52%26 == 0, letters[0] = 'A', 当前结
果为“A”,然后update52/26=2, 用2%26==2, letter[2] == 'C', append 'C' into
the head of the string, it would be wrong as the result is "CA" while the
correct result should be "BA". 但是有些case, 比如input是675时,我写的算法是
对的。感觉绕进去出不来了。 |
z****e 发帖数: 54598 | |
i****y 发帖数: 84 | |
i****y 发帖数: 84 | |
i****y 发帖数: 84 | |
t*********h 发帖数: 941 | 6 貌似26进至 又不完全是 否则应该是BA而不是AA开头
【在 k*******t 的大作中提到】 : 给你26个字母,从A-Z, 用大小为26的数组letters存放。 input为一个integer, : output为一个string. 举例如下: : input->output : 0 -> A : 1 -> B : 2 -> C : ....... : 25 -> Z : 26 -> AA : 27 -> AB
|
b******7 发帖数: 92 | 7 26进制,注意最高位对应方式是[1-26]=>[A-Z],其他位时[0-25]=>[A-Z]。
string convert(int n)
{
assert(n >= 0);
vector r;
do{
r.push_back(n%26);
n /= 26;
}while(n > 0);
reverse(r.begin(), r.end());
if(r.size() > 1){
r[0] --;
}
string s(r.size(), ' ');
for(int i = 0; i < s.length(); i++){
s[i] = 'A' + r[i];
}
return s;
} |
k*******t 发帖数: 144 | 8 面试时, 没问解码的事,就是给定一个数输出一个string. 26对应的就是"AA". 不知有
没有回答你的问题。
【在 z****e 的大作中提到】 : 你先说说26这个这么解码 : 是bf还是z
|
r*********n 发帖数: 4553 | 9 这就是不同numeral之间的转换吧
你可以用长除法把十进制转换成二进制,同理你可以用长除法把十进制转换成26进制,
然后再把0~25 map 到 'A' ~ 'Z'
比较tricky的地方是最高位的判定方法
1. 如果次高位是整除没有余数,则最高位要减一之后再map
2. 如果此高位不是整除,则最高位直接map
E.x
0 ~ 25, 不能被26整除,最高位由0~25直接map得到
52, 长除法的余数是[2, 0],但是此高位是整除,所以应该用[1, 0]map得到BA
26^2-1, 长除法余数是[25, 25],但是此高位不是整除,所以直接用[25, 25]map得到
ZZ |
r*********n 发帖数: 4553 | 10 显然不对啊
输入25,你的程序返回Y,但应该是Z
【在 b******7 的大作中提到】 : 26进制,注意最高位对应方式是[1-26]=>[A-Z],其他位时[0-25]=>[A-Z]。 : string convert(int n) : { : assert(n >= 0); : vector r; : do{ : r.push_back(n%26); : n /= 26; : }while(n > 0); : reverse(r.begin(), r.end());
|
|
|
k*******t 发帖数: 144 | 11 运行过了,有些case通过不了,比如676输出AAA, 你写的这个算法可以通过这个case。
但是如果输入是675,跑你这个程序的输出是"YZ", the output should be "ZZ", in
this case, you do NOT need to minus one.
【在 b******7 的大作中提到】 : 26进制,注意最高位对应方式是[1-26]=>[A-Z],其他位时[0-25]=>[A-Z]。 : string convert(int n) : { : assert(n >= 0); : vector r; : do{ : r.push_back(n%26); : n /= 26; : }while(n > 0); : reverse(r.begin(), r.end());
|
k*******t 发帖数: 144 | 12 如果input是28, 长除法的余数是[1, 2], 此高位不是被整除,所以直接用[1, 2]map到
"BC". In this case, the result should be "AC". 这个题目的tricky的地方就是最
高位有时要减1,有时不要。问题就是什么情况下要减1,什么情况下不要。继续求解啊。
【在 r*********n 的大作中提到】 : 这就是不同numeral之间的转换吧 : 你可以用长除法把十进制转换成二进制,同理你可以用长除法把十进制转换成26进制, : 然后再把0~25 map 到 'A' ~ 'Z' : 比较tricky的地方是最高位的判定方法 : 1. 如果次高位是整除没有余数,则最高位要减一之后再map : 2. 如果此高位不是整除,则最高位直接map : E.x : 0 ~ 25, 不能被26整除,最高位由0~25直接map得到 : 52, 长除法的余数是[2, 0],但是此高位是整除,所以应该用[1, 0]map得到BA : 26^2-1, 长除法余数是[25, 25],但是此高位不是整除,所以直接用[25, 25]map得到
|
h******s 发帖数: 86 | 13 题目不清楚
675就应该对应yz
然后676就是aaa了
【在 k*******t 的大作中提到】 : 如果input是28, 长除法的余数是[1, 2], 此高位不是被整除,所以直接用[1, 2]map到 : "BC". In this case, the result should be "AC". 这个题目的tricky的地方就是最 : 高位有时要减1,有时不要。问题就是什么情况下要减1,什么情况下不要。继续求解啊。
|
r*********n 发帖数: 4553 | 14 我觉得这个题有问题
[AA, BA, CA, ...,] 对应的是
[26*1, 26*2, 26*3, ...,]
但是如果是这样,那么ZA对应的就是26*26,但是26*26对应的是AAA
【在 k*******t 的大作中提到】 : 如果input是28, 长除法的余数是[1, 2], 此高位不是被整除,所以直接用[1, 2]map到 : "BC". In this case, the result should be "AC". 这个题目的tricky的地方就是最 : 高位有时要减1,有时不要。问题就是什么情况下要减1,什么情况下不要。继续求解啊。
|
t********y 发帖数: 14 | 15 这题在leetcode上you, 写了一个,
public string Translate(int n)
{
string s = string.Empty;
if (n < 0) return s;
while (n >= 0)
{
s = (char)('A' + n % 26) + s;
n = n / 26 - 1;
}
return s;
} |
x***y 发帖数: 633 | 16 according to the rules, 675 should be YZ; then 676 should be ZA, right?
个位数是0到25, 26进制; 其他位上的数字是0到26, 27进制。 |
k*******t 发帖数: 144 | 17 同意你的说法,当时在白版上算的时候就是算的26*26对应AAA,其实这是不对的,26*
26对应的应该是ZA。
【在 r*********n 的大作中提到】 : 我觉得这个题有问题 : [AA, BA, CA, ...,] 对应的是 : [26*1, 26*2, 26*3, ...,] : 但是如果是这样,那么ZA对应的就是26*26,但是26*26对应的是AAA
|
k*******t 发帖数: 144 | 18 你的理解是对的,675 should be YZ, 676 should be ZA.
【在 x***y 的大作中提到】 : according to the rules, 675 should be YZ; then 676 should be ZA, right? : 个位数是0到25, 26进制; 其他位上的数字是0到26, 27进制。
|
d****n 发帖数: 397 | 19 不就是26进制的问题。
【在 k*******t 的大作中提到】 : 给你26个字母,从A-Z, 用大小为26的数组letters存放。 input为一个integer, : output为一个string. 举例如下: : input->output : 0 -> A : 1 -> B : 2 -> C : ....... : 25 -> Z : 26 -> AA : 27 -> AB
|
r********7 发帖数: 102 | 20 这道题的tricky在于 个位数 A 表示 0, 但是 十位数以上 A 表示1. 可以反着想,A
= 0,
AA = 1*26 +0. 所以如果是26进制十位就不应该有Z。 ZZ=26*26+25。 而不是 25*26+
25.
或者 0 就该表示为 AxAAAA。 反过来想想10进制也是这个道理。 0-9 10个数,等进
位时候,十位第一个是1(相当于B)。 而不是01(AA)这样算 |
|
|
f****e 发帖数: 34 | 21 很久以前遇到过这题,我把这题加到oj了
http://112.124.16.117/oj/#23 (两种方式互相转换) |
s***5 发帖数: 2136 | 22 在input integer加个1,再把26进制得到的div和module,都减掉1,搞定。
string int2str(int num) {
if(num < 0) return "";
string str;
char c;
while(num >= 26) {
int rem = (num+1) % 26;
if(rem == 0)
str = 'Z' + str;
else {
c = rem-1+'A';
str = c + str;
}
num = (num+1)/26-1;
}
c = num + 'A';
return c+str;
}
【在 k*******t 的大作中提到】 : 给你26个字母,从A-Z, 用大小为26的数组letters存放。 input为一个integer, : output为一个string. 举例如下: : input->output : 0 -> A : 1 -> B : 2 -> C : ....... : 25 -> Z : 26 -> AA : 27 -> AB
|
h****p 发帖数: 87 | 23 还是有bug test 676->ZA
【在 s***5 的大作中提到】 : 在input integer加个1,再把26进制得到的div和module,都减掉1,搞定。 : string int2str(int num) { : if(num < 0) return ""; : string str; : char c; : while(num >= 26) { : int rem = (num+1) % 26; : if(rem == 0) : str = 'Z' + str; : else {
|
h****p 发帖数: 87 | 24 好像题目有错。676应该是ZA吧?
while loop里面num=(num+1)/26-1应该改成num=num/26-1吧
【在 s***5 的大作中提到】 : 在input integer加个1,再把26进制得到的div和module,都减掉1,搞定。 : string int2str(int num) { : if(num < 0) return ""; : string str; : char c; : while(num >= 26) { : int rem = (num+1) % 26; : if(rem == 0) : str = 'Z' + str; : else {
|