本文共 1498 字,大约阅读时间需要 4 分钟。
给定一个正整数,返回它作为出现在Excel表中的正确列向标题。例如: 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> AB
Given a positive integer, return its corresponding column title as appear in an Excel sheet.For example: 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> AB
我很少用Excel,所以题意不是满懂,就先看了看别人的解法。
class Solution {public: string convertToTitle(int n) { if (n<=0) return ""; if (n<=26) return string(1, 'A' + n - 1); return convertToTitle( n%26 ? n/26 : n/26-1 ) + convertToTitle( n%26 ? n%26 : 26 ); }};
然后放到VS中试了一下。终于知道题目的意思了……
1 ... A*******26 ... Z27 ... AA*******52 ... AZ53 ... BA*******702 ... ZZ703 ... AAA
大神的递归用的真是666,三目运算符也用的恰到好处,不得不佩服呐!
上面采用的是
'A' + n - 1
紧接着,我写了如下代码:
#includeusing namespace std;string convertToTitle(int n) { string title; while (n > 0) { title = (char)('A' + (--n) % 26) + title; n /= 26; } return title;}int main() { cout << convertToTitle(702); return 0;}
核心代码
title = (char)('A' + (--n) % 26) + title;
解决的是习惯上都用的是
string title;title += "X";
这样都是往末尾追加的,可能在前面追加不是很习惯,不过也是没问题的。
因为有个起始的A在里面,所以后面加的时候一开始要把n减掉1。每次得到最后一个字符,也就是每次除掉一个26,就当作是26进制一样,其实和十进制是相通的。
class Solution {public: string convertToTitle(int n) { string res; while (n > 0) { res = (char)('A' + (--n) % 26) + res; n /= 26; } return res; }};