OJ练习1——T168

【LeetCode】Excel sheet column title

输入非负整数n,输出以下格式:

1 -> A

2 -> B

......

26 -> Z

27 -> AA

28 -> AB

[分析]实质是将十进制转换为26进制。应该想到用string的+运算,可以连接字符。利用函数reverse(result.begin(),result.end())输出。

对c++语言不熟悉,一开始的做法如下:

class Solution {
public:
    string convertToTitle(int n) {
    int i,p,q;
	vector<char>vec;
	for(i=0;i<n;i++){
		cout<<i+1<<" "<<"->"<<" ";
		p=i/26;
		q=i%26;
		vec.push_back(q+65);
		while(p>0){
			q=p%26;
			p=p/26;
			vec.push_back(q+64);
			}
		vector<char>::size_type r=vec.size()-1;	
		while(r>=0&&r<n){
			cout<<vec[r];
			r--;
		}	
		cout<<endl;
		vec.clear();
	}  
    }
};

 出现Runtime Error,不能通过。

【错因】

1.OJ平台需要封装成一个类的方法,不应该用for循环打印输出。

2.程序本身有bug,10进制最小数是0,应该对应26进制最小数A,但是题目要求1对应A,那么每个n都应该减去1才能得出正确结果。

3.类中已经提示返回的是string类型,不应该用vector<char>变量。

正确做法是:

class Solution {
public:
    string convertToTitle(int n) {
        if(n < 1)
            return "";
        else
        {
            string result = "";
            while(n)
            {//get every letter in n from right to left
                n --;
                char c = n%26 + 'A';
                result += c;
                n /= 26;
            }
            reverse(result.begin(), result.end());
            return result;
        }
    }
};

 经验证,用string类型的push_back(28ms)要比+运算(4ms)更耗费时间。

原文地址:https://www.cnblogs.com/ketchups-notes/p/4199655.html