#include <iostream>#include <stdio.h>#include <vector>#include <string>#include <sstream>using namespace std;/*问题: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 ... 51-> AY 52-> AZ 53-> BA ... 26^25+26 YZ 26^26 + 1 ZA 26^26+26^1 ZZ分析:给定了整数,1~26对应A到Z,从27开始把A放在前面重复,其实相当于27进位制。二进制和十进制分别逢2进1,逢10进1,这里是逢27进1,所以是27进位制。不对这里和27进位制不同,超过27,个位需要设置为A所以52应该=26^1+26=AZ所有的数拆分成26^n次方即可难点先要确认:26^n*Kn +... + 26^2*K2 + 26*K1 + K0其中Ki属于[1,26]分别用[A,Z]表示。之前求十进制转化为二进制采用的是除2取余19 除2 得9,余19 除2 得4,余14 除2 得2, 余02 除2 得1, 余01 除2 得0 , 余1得到: 1 0 0 1 1(最后逆置即可)26进制,每次除以26,得到余数,将余数依次存储,然后逆置。如果中间遇到0,比如26^1 = Z26^2 + 1 = 677 = B?A26^2 = 676 = 26^1 + B??26^26 = Z?要确定好系数。逢Z+1变成A,前一位自动累加,当前位变成A凡是遇到总结输入:12627515253676输出:AZAAAYAZBAYZ关键:1 leecode解法:https://leetcode.com/PRoblems/excel-sheet-column-title/?tab=Solutionsn--后,每次除以26的余数作为结果,然后n=n/26,其实就是求得余数这里之所以要先n--,就是为了解决类似26^2,26^1这种不知道如何表示的情况*/class Solution {public: string convertToTitle(int n) { stringstream stream; char value; while(n > 0) { n--; value = 'A' + (n % 26); stream << value; n /= 26; } //需要逆置 string result = stream.str(); reverse(result.begin() , result.end()); return result; }};void print(vector<int>& result){ if(result.empty()) { cout << "no result" << endl; return; } int size = result.size(); for(int i = 0 ; i < size ; i++) { cout << result.at(i) << " " ; } cout << endl;}void process(){ vector<int> nums; int value; int num; Solution solution; vector<int> result; while(cin >> num ) { string myNum = solution.convertToTitle(num); cout << myNum << endl; }}int main(int argc , char* argv[]){ process(); getchar(); return 0;}
新闻热点
疑难解答