题目1️⃣:
二进制中1的个数
分析:位运算复习:若n&1=1,则n二进制表示的最后一位为1️⃣,反之为0️⃣
class Solution {
public:
int hammingWeight(uint32_t n) {
int ret=0;
while(n){
ret+=n&1; //ret加n最后一位
n>>=1; //位运算,n右移,去掉最后一位
}
return ret; //输出结果
}
};
题目2️⃣:
各位相加
分析:标准模板题,循环即可
class Solution {
public:
int addDigits(int num) {
while(num>=10){
int k=0;
int x=num; //用x来做num的替身
while(x){
k+=(x%10);
x/=10;
}
num=k; //更新num的值为k
}
return num;
}
};
数学优化(力扣高手题解):
return (num-1)%9+1; //也可直接(num%9),当num为9的倍数时特判即可(不要0)
题目3️⃣:
二进制链表转整数
分析:关键是数据结构-链表的理解:单向链表中的每个 结点连着下一个结点,只有要访问某个结点的元素,必先访问其前一个结点。
结点总数不超过30,说明不会溢出。
class Solution {
public:
int getDecimalValue(ListNode* head) {
ListNode* k=head; //从头结点访问
int tmp=0;
for(;k!=nullptr;){
tmp=tmp*2+k->val;
k=k->next; //k划到下一个结点
}
return tmp;
}
};
题目4️⃣:
k进制表示下的各位数字之和
分析:一般的进制转化而已啦
class Solution {
public:
int sum=0;
string c="0123456789"; //k范围为0~9,设置字符串c
void f(int a,int b){
if(a/b)f(a/b,b);
sum+=int(c[a%b]-'0'); //模拟进制转化操作,sum通过递归加上转化后的各位
}
int sumbase(int n, int k) {
f(n,k);
return sum;
}
};
题目5️⃣:
统计最大组的数目
分析:统计,意味着可能需要查找,而用单一的数组查找比较困难,所以很自然的想到哈希表
现在的我也只会哈希表,一个键值为某数的位数和,哈希值为该位数和出现的次数。
当然,也可以嵌套两个数组外面的数组用来计数,里面的用来记所有可能的key,这就很造成空间的损失
class Solution {
public:
int countLargestGroup(int n) {
unordered_maphashtable;
int maxval=INT_MIN,cnt=0;
for(int i=1;i<=n;i++){
int key=0,io=i; //用io代替i
while(io){
key+=io%10;
io/=10;
} //局部变量key记录位数和
hashtable[key]++;
maxval=max(hashtable[key],maxval);//更新最大位数和
}
for(pair i:hashtable){ //遍历哈希表
if(i.second==maxval)cnt++;
}
return cnt;
}
};
接下来的例题超简单(套用模板即可):
七进制数
class Solution {
public:
string c="0123456";
string convertTobase7(int num) {
if(num==0)return "0";
bool i=0;
string res="";
if(num<0){num*=-1;i=1;} //对0和负数特殊处理
while(num){
res+=c[num%7];
num/=7; //从低位往高位转化
}
if(i)res+="-";
reverse(res.begin(),res.end()); //翻转
return res;
}
};
题目7️⃣:
又是位运算的使用(补码反码原码要弄清)
数字转换为十六进制数
class Solution {
public:
string c="0123456789abcdef";
string toHex(unsigned num) {
string res;
res=c[num&15]; //位运算,num&15=num%16
while(num>>=4){ //num>>=4即num/=16;
res=c[num&15]+res;
}
return res;
}
};



