概述
文章目录
- 剑指 Offer 15. 二进制中1的个数
- 枚举每一个数位
- 258. 各位相加
- 暴力循环
- 原地算法
- 1290. 二进制链表转整数
- 遍历链表
- 1837. K 进制表示下的各位数字总和
- 短除法一直取余
- 1399. 统计最大组的数目
- 暴力
- 504. 七进制数
- 短除法
- 405. 数字转换为十六进制数
- 短除法
剑指 Offer 15. 二进制中1的个数
题目链接
枚举每一个数位
class Solution {
public:
int hammingWeight(uint32_t n) {
int cnt=0;
while(n)
{
if(n&1) cnt++;
n>>=1;
}
return cnt;
}
};
258. 各位相加
题目链接
暴力循环
取出每一个数位,然后一直求数位和,直到是个位数返回
class Solution {
public:
int addDigits(int num) {
int sum=0;
while(1)
{
while(num)
{
sum+=num%10;
num/=10;
}
if(sum/10==0) return sum;
num=sum;
sum=0;
}
}
};
原地算法
观察可以得到除0以外其他数字的数位和都是对应十进制数字对9取余的结果(9的倍数是9)
class Solution {
public:
int addDigits(int num) {
return (num-1)%9+1;
}
};
1290. 二进制链表转整数
题目链接
遍历链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
int getDecimalValue(ListNode* head) {
int sum=0;
ListNode* p=head;
while(p!=NULL)
{
sum=sum*2+p->val;
p=p->next;
}
return sum;
}
};
1837. K 进制表示下的各位数字总和
题目链接
短除法一直取余
class Solution {
public:
int sumBase(int n, int k) {
int sum=0;
while(n)
{
sum+=n%k;
n/=k;
}
return sum;
}
};
1399. 统计最大组的数目
题目链接
暴力
算一下时间来证明其可行,在这里只计算最慢的双层循环部分。n得最大值是10000,也就是说外层循环最多有10000次,数字位数最大有五位,所以计算次数不会超过50000次(且不说五位数只有一个)
class Solution {
public:
int countLargestGroup(int n) {
unordered_map<int,int>mp;
for(int i=1;i<=n;i++)
{
int j=i;
int sum=0;
while(j)
{
sum+=j%10;
j/=10;
}
mp[sum]++;
}
int maxn=0;
for(auto t:mp) maxn=max(maxn,t.second);
int cnt=0;
for(auto t:mp) if(t.second==maxn) cnt++;
return cnt;
}
};
504. 七进制数
题目链接
短除法
class Solution {
public:
string convertToBase7(int num) {
if(num==0) return "0";
int k=0;
if(num<0)
{
k=1;
num=-num;
}
string ch;
while(num)
{
ch=(char)(num%7+'0')+ch;
num/=7;
}
if(k) ch='-'+ch;
return ch;
}
};
405. 数字转换为十六进制数
题目链接
短除法
和上一题一样就是除呗,因为十六进制里面有字母,所以建立一个他们的对应关系。这道题还有一个比较恶心的点,就是它里面有负数。(补码反码的知识自行百度)1的十六进制是ffffffff,而比他更小的负数n的十六进制其实是ffffffff减去 − 1 − n -1-n −1−n的十六进制。举个例子,-3的十六进制是ffffffff减去(-1-(-3))的十六进制所以是fffffffd。发现了这一点我们就可以直接给所有附属加上一个偏移量1<<32了
class Solution {
public:
string toHex(int num) {
long res=num;
if(num==0) return "0";
if(num<0) res+=1ll<<32;
unordered_map<int,char>mp;
for(int i=0;i<=9;i++) mp[i]=i+'0';
for(int i=10;i<=15;i++) mp[i]=i-10+'a';
string ch;
while(res)
{
ch=mp[res%16]+ch;
res/=16;
}
return ch;
}
};
最后
以上就是拼搏学姐为你收集整理的力扣·进制转换的全部内容,希望文章能够帮你解决力扣·进制转换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复