【leetcode】excel

Given a column title as appear in an Excel sheet, return its corresponding column number.

For example:

    A -> 1
    B -> 2
    C -> 3
    ...
    Z -> 26
    AA -> 27

AB -> 28

分析:可以当作是进制转换。先确定字符串的位数,然后从低位到高位,转换到相对应的数字,然后累加。

class Solution {
public:
    int titleToNumber(string s) {
    int digits=s.size();
	int res=0;
	for (int i=digits-1;i>=0;i--)
	{
		res=res+(s[i]-'A'+1)*(double)pow((double)26,digits-i-1);
	}
	return res;
    }
};



类似的:

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 
分析:注意每一位是从1开始,而不是0,因此与数字上的进制转换有所差别。要先减一处理。

class Solution {
public:
    string convertToTitle(int n) {
<span style="white-space:pre">	</span>if (n==1)
	{
		return "A";
	}
	int digits;
	digits=(double)log((double)((double)25/26*(n-1)+1))/(double)log((double)26)+1;
	
	string re;
	re.resize(digits);

	for (int i=digits-1;i>=0;)
	{
		int t=(n-1)%26+1;
		re[i--]='A'+t-1;

		n=(n-((n-1)%26+1))/26;
	}
		return re;
    }
};

出现的问题:

1、确定位数时,应根据等比数列求和的公式倒推回来。当n较大时,可能*25会溢出,所以先算25/26,并强制转换为double,不然就是int了。

2、由于每位都是从1开始,因此做进制转换时,先减一,如 (n-1)%26+1;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值