《算法基础学习》进制转换(入门)
Posted 可口也可樂、
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法基础学习》进制转换(入门)相关的知识,希望对你有一定的参考价值。
目录
算法学习
《算法零基础100讲》(第19讲) 进制转换(一) - 入门_英雄哪里出来-CSDN博客https://blog.csdn.net/WhereIsHeroFrom/article/details/120875977
习题解题报告
例题1
二进制中1的个数https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/
- 题目描述:
- 解题思路:
比较基础,取余和除法的使用
- 参考代码:
nt hammingWeight(uint32_t n) {
int i,cnt=0;
while(n)
{
if(n%2==1)
cnt++;
n/=2;
}
return cnt;
}
例题2
各位相加https://leetcode-cn.com/problems/add-digits/
- 题目描述:
- 解题思路:
对于一般来说使用循环便可以解决
如果是进阶来说,便需要一点数学思想:
这里我们让一个三位数表示成xyz,那么就有x*100+y*10+z=x*99+y*9+x+y+z
要得到x+y+z则整体%9
这个题得到的结果一定为0-9,如果%9的话结果为0-8,那么先拆出一个1再加上1:
(x*99+y*9+x+y+z+1-1)%9=(x+y+z-1)%9+1%9=(x+y+z-1)%9+1
- 参考代码:
int addDigits(int num){
return (num-1)%9+1;
}
例题3
- 题目描述:
- 解题思路:
链表的遍历+进制的思想
- 参考代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int getDecimalValue(struct ListNode* head){
int ret=0;
struct ListNode*cur=head;
while(cur)
{
ret=ret*2+cur->val;
cur=cur->next;
}
return ret;
}
例题4
- 题目描述:
- 解题思路:
进制转换+各数求和(取余和除法)
- 参考代码:
int sumBase(int n, int k){
int ret=0;
while(n)
{
ret=ret*10+n%k;
n/=k;
}//得到的数是反过来的,不过并不碍事
int ans=0;
while(ret)//简单求各位数和
{
ans+=ret%10;
ret/=10;
}
return ans;
}
例题5
1399. 统计最大组的数目 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/count-largest-group/
- 题目描述:
- 解题思路:
对于各数和的数用标记数组记录,同时记录最大个数,再遍历计数
- 参考代码:
int countLargestGroup(int n){
int book[50]={0};//标记各数和数组(各数和有范围)
int max=0;//记录最大个个数
int i;
for(i=1;i<=n;i++)
{
int sum=0;
int tmp=i;
while(tmp)//各数和
{
sum+=tmp%10;
tmp/=10;
}
book[sum]++;//标记和的个数
if(book[sum]>max)//标记最大
max=book[sum];
}
int cnt=0;//遍历计数
for(i=1;i<50;i++)
{
if(book[i]==max)
cnt++;
}
return cnt;
}
例题6
504. 七进制数 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/base-7/
- 题目描述:
- 解题思路:
算法学习中已经讲解过了
- 参考代码:
char * convertToBase7(int num){
char*ret=(char*)malloc(sizeof(char)*20);
int stack[20]={0},top=0;//数组栈
int retsize=0;
if(num<0)//正负号
{
ret[retsize++]='-';
num=-num;
}
if(num==0)//特殊情况
{
return "0";
}
else
{
while(num)//反向储存进制数
{
stack[top++]=num%7;
num/=7;
}
}
while(top--)
{
ret[retsize++]=stack[top]+'0';//反向转化
}
ret[retsize]='\\0';//结束符
return ret;
}
例题7
- 题目描述:
- 解题思路:
再上题基础上再变化一下就可以了
- 参考代码:
char * toHex(int num){
char*ret=(char*)malloc(sizeof(char)*20);
int stack[20]={0},top=0;//数组栈
int retsize=0;
unsigned int n=num;//补码运算
if(n==0)//特殊情况
{
return "0";
}
else
{
while(n)//反向储存进制数
{
stack[top++]=n%16;
n/=16;
}
}
while(top--)
{
if(stack[top]>=10)
{
ret[retsize++]=stack[top]-10+'a';
}
else
{
ret[retsize++]=stack[top]+'0';//反向转化
}
}
ret[retsize]='\\0';//结束符
return ret;
}
以上是关于《算法基础学习》进制转换(入门)的主要内容,如果未能解决你的问题,请参考以下文章