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

2021/11/10 1:10:09

本文主要是介绍《算法零基础》第20讲:进制转换(2)习题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

前言

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

目录

  • 前言
  • LeetCode 168. Excel表列名称
    • 分析
    • 代码
  • 171. Excel 表列序号
    • 分析
    • 代码
  • 课后习题
    • LeetCode 483. 最小好进制

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. 最小好进制

在这里插入图片描述



这篇关于《算法零基础》第20讲:进制转换(2)习题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程