LeetCode 168. Excel Sheet Column Title && LeetCode 171. Excel Sheet Column Number

171. 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 
    ...

Example 1:

Input: "A"
Output: 1

Example 2:

Input: "AB"
Output: 28

Example 3:

Input: "ZY"
Output: 701

为什么先在这儿放171然后才放168呢,因为171我秒做但是168我到现在还没完全理解,真令人头大。这两道题其实可以看做十进制和二十六进制之间的转换,只是这个二十六进制不像普通的二进制十六进制一样有0,但其实也可以把A看作0,Z看作25,Emmm,这个后面再说。

171这道题其实就是二十六进制转十进制,写几个样例出来就会发现,A代表1,Z代表26,然后就可以按照进制的做法,当前位的数字乘上26的位数次方,截个discussion上的图来就一目了然了。

于是,代码很快就写出来了。后来在discussion里见到直接把上一次的结果*26以后再加上当前位数的,觉得很机制,就也加在注释里了。

代码如下,时间4ms,91.97%,空间8.5M,5.04%:

/*
 * @lc app=leetcode id=171 lang=cpp
 *
 * [171] Excel Sheet Column Number
 */
class Solution {
public:
    int titleToNumber(string s) {
        int size = s.size();
        int result = 0;
        for (int i = size - 1; i >= 0; i--) {
            result += (s[i] - 'A' + 1) * pow(26, size - i - 1);
            //result = result * 26 + (s[i] - 'A' + 1)
        }
        return result;
    }
};


 

168. Excel Sheet Column Title

题目

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 
    ...

Example 1:

Input: 1
Output: "A"

Example 2:

Input: 28
Output: "AB"

Example 3:

Input: 701
Output: "ZY"

好的,下面来到了168,十进制转二十六进制:)前面提到过了,这里没有0,但是有26,于是,就要在采用长除法求进制的基础之上再进行改造,针对余数为0的情况进行特殊的处理。先来介绍一下长除法吧,我都忘了怎么求了,还是上网搜出来的。

长除法的原理就是,把待求的数字n除以进制数,每一次除法取余数作为从右往左的位数,并取商作为下一次的被除数。

回到本题的特殊二十六进制的情况,当求出来的余数不为0的时候,直接快乐地加一位'A'+ r - 1就好,但当求出来的余数为0的时候就要小心了,往result里面加的字母应该是'Z'没错,但是我就是想不通接下来要对这个被除数做什么特殊处理。看了discussion才知道需要再把被除数-26,我的感觉上应该是这个意思,不确定对不对,就是要把'Z'代表的26从总数中减掉,因为如果是普通的带余数的话,其实在整除的时候已经悄咪咪地把余数给剔除了,而如果是余0就不做操作,也就是现在余26的话就要减掉26?

于是这种想法的代码如下,时间0ms,100%,空间8.3M,5.08%:

class Solution {
public:
    string convertToTitle(int n) {
        string result = "";

        while (n != 0) {
            int remainder = n % 26;
            cout << n << " " << remainder << " ";
            if (remainder == 0) {
                result = 'Z' + result;
                //n -= 26;
            }
            else {
                result = char('A' + remainder - 1) + result;
            }
            n = n / 26;
        }
        
        return result;
    }
};

另外一种做法就是简单地把A当作0,Z当作25,整体向前挪一位,思路倒是很清晰,但是写起代码来也是让我很困惑。余数那里-1我可以理解,但是最后为什么还要在整除的时候-1呢?

有一位老哥举了个例子,52 = AZ = (A' + 1) * 26 + (Z' + 1) * 1.

如果要求Z',它就是(52 - 1) % 26 = 25,即(n - 1) % 26;而如果要求A',如果直接n /= 26,那A'就变成了2(小哥说的Z' + 1 will give additional 1我没咋看懂orz),所以要先-1?

姑且先这么理解吧,这种方法的代码如下,时间4ms,84.67%,空间8.3M,5.08%:

class Solution {
public:
    string convertToTitle(int n) {
        string result = "";

        while (n != 0) {
            int remainder = (n - 1) % 26;
            result = char(remainder + 'A') + result;
            n = (n - 1) / 26;
        }
        
        return result;
    }
};

另外还看到了递归的骚操作,一行就搞定了,真的是很骚了,直接贴链接吧:https://leetcode.com/problems/excel-sheet-column-title/discuss/51398/My-1-lines-code-in-Java-C%2B%2B-and-Python

小小一道数学题折磨了我两小时,流下了数学不好的泪水。

数据集介绍:野生动物目标检测数据集 一、基础信息 数据集名称:野生动物目标检测数据集 图片数量: - 训练集:11,787张图片 - 验证集:643张图片 - 测试集:431张图片 总计:12,861张真实场景图片 分类类别: - Elephant(象):陆生大型哺乳动物,包含多种自然环境中的活动姿态。 - Bear(熊):涵盖不同种类的熊科动物,包括静态及运动状态。 - Cheetah(猎豹):强调高速运动状态下的动态捕捉样本。 - Deer(鹿):包含林地和草原环境中的鹿群及个体样本。 - Fox(狐):涵盖多种狐狸品种的多样化行为模式。 标注格式: YOLO格式,包含标准化的归一化坐标标注,可直接适配YOLOv5/v7/v8等主流检测框架。 数据特性: 涵盖航拍、地面视角等多角度拍摄的野生动物图像,包含昼夜不同光照条件下的样本。 二、适用场景 生态监测系统开发: 支持构建自然保护区智能监测系统,实时检测野生动物活动轨迹并统计种群分布。 自动驾驶环境感知: 用于训练车辆视觉系统识别道路周边野生动物的能力,提升行车安全系数。 野生动物研究分析: 提供动物行为学研究的结构化数据支撑,支持物种活动模式分析与栖息地研究。 安防监控系统升级: 适用于农场、林区等场景的智能安防系统开发,精准识别潜在动物威胁。 三、数据集优势 多物种覆盖: 包含5类高关注度野生动物,覆盖陆地生态系统的关键指示物种。 场景多样性: 数据采集涵盖丛林、草原、山地等多种自然生境,增强模型泛化能力。 标注专业性: 经动物学专家校验的精准边界框标注,确保目标定位与分类准确性。 任务适配性: 原生YOLO格式支持快速迁移至目标检测、行为分析、密度估计等衍生任务。 规模优势: 超万级标注样本量,有效支撑深度神经网络的特征学习需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值