文章目录
剑指 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;
}
};