《算法零基础》第20讲:进制转换(2)习题

本文深入解析了LeetCode上的168和171题,涉及将Excel列名称转换为数字和反之的过程。通过十进制与26进制的相互转换,阐述了算法细节,并提供了相应的C++实现代码。此外,还提及了483题的最小好进制问题,进一步拓展了进制转换的讨论。
摘要由CSDN通过智能技术生成

前言

文章参考自:英雄哪里出来

LeetCode 168. Excel表列名称

原题链接:168. Excel表列名称

在这里插入图片描述

分析

由题意得excel 表相当于26进制,且是按 A~Z 计数的。

那只需要十进制转26进制,利用整数每次对26取模,再加上字符A,因为取模结果为相对于A的偏移量。

代码

void Reverse(char* str)
{
    int left = 0, right = strlen(str) - 1;
    while (left < right)
    {
        char tmp = str[left];
        str[left] = str[right];
        str[right] = tmp;
        left++;
        right--;
    }
}

char * convertToTitle(int columnNumber)
{
    char* ans = (char*)malloc(sizeof(char) * 8);
    int ansSize = 0;

    while (columnNumber)
    {
        --columnNumber;
        ans[ansSize++] = columnNumber % 26 + 'A';
        columnNumber /= 26;
    }
    ans[ansSize] = '\0';
    
    Reverse(ans);
    return ans;
}

171. Excel 表列序号

原题链接:171. Excel 表列序号

在这里插入图片描述

分析

对与字符串,从前往后,每一个权位都比后面的一个字符多了一个26的一次方。
那就拿字符串从后往前计算,每次循环把26的次方都带上。

示例:
若字符串为:“ABCD”;
对应的数字为 [1,2,3,4]

那计算过程就为 :
4×26 ^ 0 + 3×26 ^ 1 + 2×26 ^ 2 + 1×26 ^ 3

代码

int titleToNumber(char * columnTitle)
{
    if (NULL == columnTitle)
        return 0;

    int ans = 0, tmp = 0;
    long long secondary = 1;

    for (int i = strlen(columnTitle) - 1; i >= 0; --i)
    {
        tmp = columnTitle[i] - 'A' + 1;
        ans += tmp * secondary;
        secondary *= 26;
    }

    return ans;
}

课后习题

LeetCode 483. 最小好进制

原题链接:483. 最小好进制

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_索伦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值