【LeetCode从零单刷】Excel Sheet Column Number

题目:

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 

解答:

怎么说,类似26进制数一样。乍看之下挺简单。于是写下:

class Solution {
public:
    int titleToNumber(string s) {
    	int len = s.size();
        if(len <= 0)    return 0;
        
        int base = 0;
        for(int i = 0; i< len; i++)
        {
            base += (s[i] - 'A' + 1) * pow(26, len - i - 1);
        }
        return base;
    }
};
然后WA。。。慢慢查错。我竟然发现:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(){
	int a = 1;
	printf("%d\n", (int)pow(26, a));
	printf("%f\n", pow(26, a));
	return 0;
}
输出第一行是25,第二行是26.000000. 说实话,当时我的心情几乎是崩溃的。

后来发现:关于pow函数的强制类型转换浮点数都是不精确的,在强制转换精度时可能会出现 (int)25.999999 = 26 的情况。

所以我将 int base = 0; 改为 float base = 0; ,结果还是不对。错误显示在:

Input:"CFDGSXM";Output:1000000000;Expected:1000000001

于是我出离愤怒了。竟然超过了数据可表示精度。最终换成了:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值