主要目录
零、写在前面
这是打卡的第十九天,今天题目比较简单,就是题量巨大,,主要知识点在
一、主要知识点
1.十进制转7进制
其实主要方法就是除留余数法则。
while(n){
ans += n % k; //取余数
n /= k; //除k
}
二、课后习题
剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/
主要思想
按照位运算,从1到32位进行扫描就好了。
int hammingWeight(uint32_t n) {
int count = 0;
for(int i = 0;i < 32;i++) //位移统计1个数
if(n & ((uint32_t)1 << i)) count++; //1要转换类型 不然默认位int会溢出
return count;
}
结果分析
结果还是极好的
258. 各位相加
258. 各位相加https://leetcode-cn.com/problems/add-digits/
主要思想
利用除留余数法得到10进制的各个和,反复执行直到小于10就好了。
int addDigits(int num){
int ans = num; //结果
while(ans/10){ //和ans < 10没有本质区别
num = ans; //num赋值位之前的结果
ans = 0; //ans初始化
while(num){ //统计num中各位和
ans += num % 10;
num /= 10;
}
}
return ans;
}
结果分析
凑合,还行。
1290. 二进制链表转整数
1290. 二进制链表转整数https://leetcode-cn.com/problems/convert-binary-number-in-a-linked-list-to-integer/
主要思想
每次乘2做加法就好了,有点像2分快速幂的感觉。代码不难,直接看吧。
int getDecimalValue(struct ListNode* head){
int sum = 0;
for( ; head; head = head -> next){ //遍历链表
sum += head-> val; //加入此节点
sum *= 2; //作位移
}
return sum / 2; //其实先做位移就不需要这个了,期待你们优化
}
结果分析
还行吧。
1837. K 进制表示下的各位数字总和
1837. K 进制表示下的各位数字总和https://leetcode-cn.com/problems/sum-of-digits-in-base-k/
主要思想
和上面的某道题没啥区别。
int sumBase(int n, int k){
int ans = 0;
while(n){ //除留余数法
ans += n % k;
n /= k;
}
return ans;
}
结果分析
可以了
1399. 统计最大组的数目
1399. 统计最大组的数目https://leetcode-cn.com/problems/count-largest-group/
主要思想
利用hash表存储所有和的值对应元素个数,顺带统计最大值,返回就好了
int countLargestGroup(int n){
int f[37] = {0},max=0; //记录最大值、记录相应和的数目hash表
for(int i = 1;i <= n; i++){ //从1到n做统计
int count = 0,temp = i; //统计个数初始化
while(temp){ //除留余数法
count += temp%10;
temp /= 10;
}
f[count]++; //相应的值+1
if(f[count] > max) max = f[count];//更新max值
}
int ans = 0; //判断最终的答案
for(int i = 0;i < 37;i++){
if(f[i] == max) ans++; //看看等于max的有几个
}
return ans;
}
结果分析
简洁,完美
504. 七进制数
504. 七进制数https://leetcode-cn.com/problems/base-7/
主要思想
转换为7进制数。就用算法求就好了,但是要注意负数的处理,个人觉得没必要用fabs,小于0的时候增加负号的时候顺带把值取-n就好了呗。
char * convertToBase7(int num){
char *s = malloc(sizeof(char) * 15); //申请空间
int stack[15]; //利用栈反转数组
int count = 0,countnum = 0;
if(num == 0) s[count++] = '0'; //0的处理
if(num < 0){ //负值的处理
s[count++] = '-'; //插入符号
num = -num; //取反
}
while(num){
stack[countnum++] = num % 7; //入栈
num /= 7; //除留余数
}
int i = countnum; //栈的统计量
while(i--){
s[count++] = stack[--countnum] + '0';//出栈入数组
}
s[count] = 0; //将最后的值置为0表示结束 上面是count++,所以count是大了1的这里不用+1
return s;
}
结果分析
凑合
405. 数字转换为十六进制数
405. 数字转换为十六进制数https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/
主要思想
直接强制变成unsigned 就直接打印反码了,小技巧把。
char * toHex(int num){
char s[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};//16进制表示
char *ans = malloc(sizeof(char) * 9);//返回的要malloc或者选择全局变量,但是还是malloc比较好
int count = 0,stack[8],countnum = 0;//利用栈反序
if(num == 0) ans[count++] = '0'; //0的特殊判定
unsigned int a = num; //直接做强转可以用位移
while(a){
stack[countnum++] = a % 16; //入栈
a /= 16;
}
while(countnum){
ans[count++] = s[stack[--countnum]]; //出栈入数组
}
ans[count] = 0; //标记结束
return ans;
}
结果分析
还行
三、今日总结
有点卷不动了。还有论文没写,神经网络好难。。。。还有今晚的presentation ,祝我顺利把-.-