IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [解题报告]《算法零基础100讲》(第20讲) 进制转换(二) - 进阶参考题解(C语言实现) -> 正文阅读

[数据结构与算法][解题报告]《算法零基础100讲》(第20讲) 进制转换(二) - 进阶参考题解(C语言实现)

目录

?一、算法思想

?二、405. 数字转换为十六进制数

?三、Excel列表序号

?四、168. Excel表列名称


?

?一、算法思想

我们先来看看如何把10进制转化为2进制(网图)

对10进制数反复除2取余数,最后倒序输出的余数序列就是我们需要的二进制序列。怎么理解呢?先来看看我们是怎么理解序列101011的:1*2^0+1*2^1+0*2^2+1*2^3+0*2^4+1*2^5。就和十进制一样每个2进制数都是有权重的,我们在反复除2的过程中剩余的数的权重一直在翻倍,直到余数为0,如这里最下面的1,他代表的权重就是2^5。

?转化为k进制也是同样的道理

【核心代码】

while (n)
{
	arr[cnt++] = n % k;//用数组记录每次的余数
	n /= k;
}
//注意这里得到的序列还需要逆序才是真正的k进制序列

?

二、405. 数字转换为十六进制数

①题目呈现

405. 数字转换为十六进制数icon-default.png?t=LA46https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/

?思路:因为二进制转换涉及负数,所以我们从二进制的角度切入最为合适。这里一个重要的关系就是二进制4位换十六进制1位?

②代码操练?

char * toHex(int num)
{
    if(num == 0)
        return "0";
    char* ans = (char*)malloc(sizeof(char) * 9);
    char str[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    int a = 0b1111;
    int cnt = 0;
    
    while(num)//2进制四位换16进制一位
    {
        ans[cnt] = str[num & a];
        num =(unsigned)num >> 4;
        cnt++;
    }
    int i = 0; int j = cnt - 1;
    while(i < j)//字符串反转
    {
        int tmp = ans[i];
        ans[i] = ans[j];
        ans[j] = tmp;
        i++;j--;
    }
    ans[cnt] = '\0';
    return ans;
}

?【易错点】1.注意字符串要以‘\0’结尾,所以malloc开辟空间时要开辟9字节

? ? ? ? ? ? ? ? ? 2.注意强制转换为unsigned再>>,因为有符号-1一直右移仍然是-1

?三、Excel列表序号

①题目呈现

171. Excel 表列序号https://leetcode-cn.com/problems/excel-sheet-column-number/icon-default.png?t=LA46https://leetcode-cn.com/problems/excel-sheet-column-number/

?

?这道题目就很简单,是26进制转10进制,按位权重展开即可

②代码操练?

int titleToNumber(char * columnTitle)
{
    int len =strlen(columnTitle);//计算长度
    int ans = 0;
    for(int i = 0 ; i < len; i++)
    {
        ans = ans * 26 ;//(1)
        ans += columnTitle[i] - 64; //(2)
    }
    return ans;
}

【易错点】 (1)(2)两步骤不可以和为ans = ans * 26 + columnTitle[i] - 64,因为计算过程中先算出ans * 26 + columnTitle[i]的值可能会溢出

四、168. Excel表列名称

①题目呈现

168. Excel表列名称icon-default.png?t=LA46https://leetcode-cn.com/problems/excel-sheet-column-title/?

思路①:这道题目的难点就在于数字是从1~26而不是从0~25,这使得我们在十进制转二十六进制中时需要“借一位”。

思路②:如何避免借一位呢?上述“借一位”产生的原因在于数字从1开始,所以我们只要使得数字每次运算时-1,那所有的结果都会减小1,完美解决了问题

思路①?

void swap(char *a, char *b) 
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

char * convertToTitle(int columnNumber)
{
    int *num = (int *)malloc( sizeof(int) * 100 );
    char *ret = (char *)malloc( sizeof(char) * 100 );
    int retSize = 0;
    int i;
    while(columnNumber) 
    {             
        num[ retSize++ ] = columnNumber % 26 - 1;
        columnNumber /= 26;
    }
    num[retSize] = 0;                 
    for(i = 0; i < retSize; ++i) 
    {    
        if(num[i]<0)
        {
            num[i] += 26
            num[i+1] -=1
        }    
    }
    if(num[retSize] == -1) 
    {         
        --retSize;
    }
    for(i = 0; i < retSize; ++i)
    {    
        ret[i] = num[retSize-1-i] + 'A';
    }
    ret[retSize] = '\0';             
    return ret;
}

?思路②

char * convertToTitle(int columnNumber)
{
    int cnt = 0;
    char*str = (char*)malloc(sizeof(char) * 10);
    while(columnNumber)
    {
        columnNumber--;
        str[cnt++] = columnNumber % 26 + 'A';
        columnNumber /= 26;
    } 
    for(int i = 0; i < cnt / 2; i++)
    {
        char tmp = str[i];
        str[i] = str[cnt - i - 1];
        str[cnt - i - 1] = tmp;
    }
    str[cnt] = '\0';
    return str;
}

【易错点】最后的\0不要忘记了

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:39:06  更:2021-11-10 12:39:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:37:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码