本文共 4146 字,大约阅读时间需要 13 分钟。
上周咸鱼了,这周再次重新做人!
分析:奇数位的数字用来判断重复数量,偶数位的数字用来作为重复数字;然后还要连接各个子列表。
难点在于,1.如何将多个子数组串联在一起?(控制频次和遍历原数组可以用双层for循环完成。用python应该会简单多了,用V有点麻烦。)2.如何确定目标数组的长度? 解决:首先确定目标数组的长度,就是两步,原数组的偶数位,偶数位的值控制频次。int* decompressRLElist(int* nums, int numsSize, int* returnSize){ *returnSize = 0; int len = numsSize / 2; for(int i = 0;i < len;i++){ *returnSize += nums[2*i]; } int index = 0; int *ret = (int *) calloc (*returnSize,sizeof(int)); for(int k = 0;k < numsSize;k+=2){ for(int j = 0;j < nums[k];j++){ ret[index++] = nums[k+1]; } } return ret;}
分析:思路挺简单的,只要num不为0,如果是奇数就-1,如果是偶数就/2,然后定义一个计数器统计次数即可。
int numberOfSteps (int num){ int count = 0; while(num !=0){ if(num % 2 == 0){ num/=2; count++; } else{ num-=1; count++; } } return count;}
分析:这题思路也挺简单的,首先第一层for循环控制顺序遍历,然后将比较结果放置到返回数组中,第二层for循环控制遍历比较。
int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize){ int *retArr = (int*)malloc((sizeof(int))*numsSize); for(int i = 0;i < numsSize;i++){ int count = 0; for(int j = 0;j < numsSize;j++){ if((i!=j)&&(nums[j] < nums[i])){ count++; } } retArr[i] = count; } *returnSize = numsSize; return retArr;}
方法一:切比雪夫距离
对于平面上的两个点 x = (x0, x1) 和 y = (y0, y1),设它们横坐标距离之差为 dx = |x0 - y0|,纵坐标距离之差为 dy = |x1 - y1|,对于以下三种情况,我们可以分别计算出从 x 移动到 y 的最少次数:
dx < dy:沿对角线移动 dx 次,再竖直移动 dy - dx 次,总计 dx + (dy - dx) = dy 次;dx == dy:沿对角线移动 dx 次;dx > dy:沿对角线移动 dy 次,再水平移动 dx - dy 次,总计 dy + (dx - dy) = dx 次。
可以发现,对于任意一种情况,从 x 移动到 y 的最少次数为 dx 和 dy 中的较大值 max(dx, dy),这也被称作 x 和 y 之间的 切比雪夫距离。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/minimum-time-visiting-all-points/solution/fang-wen-suo-you-dian-de-zui-xiao-shi-jian-by-le-2/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。int minTimeToVisitAllPoints(int** points, int pointsSize, int* pointsColSize){ int i,time = 0,dx,dy; for(i = 1;i < pointsSize;i++){ dx = abs(points[i][0] - points[i-1][0]); dy = abs(points[i][1] - points[i-1][1]); if(dx < dy){ time += dy; } else{ time += dx; } } return time;}
这里points[i][0],其中i控制的是数组中的各个数的坐标,0指的是横坐标,合起来就能顺序遍历每个数的横坐标;
同理points[i][1],其中i控制的是数组中的各个数的坐标,0指的是纵坐标,合起来就能顺序遍历每个数的纵坐标。 这里感觉关系有点绕,写出来代入实例会理解得好一点。分析:思路挺简单,就是将数组中的每一位不断除以10(直到为0)统计次数,然后用一个计数器来存放操作次数为奇数的个数。(为什么是奇数,是因为最后一位没有算进除以10的操作次数里)
int findNumbers(int* nums, int numsSize){ int num; int total = 0; for(int i = 0;i < numsSize;i++){ num = 0;//假如说把这句代码放在int total = 0;下边,测试用例能过,但是提交就是错的 while(nums[i] != 0){ nums[i] /= 10; num++; } if(num % 2 == 0){ total++; } } return total;}
分析:要计算特定位置的元素和的话,那么就必须要找到这些位置的元素的相似性。首先,主对角线上的元素共同点是,横坐标和纵坐标是一样的,副对角线上的元素共同点是,横坐标和纵坐标相加等于方阵的最大列号(或者行号)。最后,既在主对角线上又在副对角线上的元素只能算一次,也就是说同时满足上边两点。
int diagonalSum(int** mat, int matSize, int* matColSize){ int sum = 0; int common = 0; for(int i = 0;i < matColSize;i++){ for(int j = 0;j < matColSize;j++){ if((i == j)||(i+j== matColSize)){ sum+=mat[i][j]; } if(i == j)&&(i+j== matColSize)){ common = mat[i][j]; } } } return (sum-common);}
分析:首先就是要解析S,将其中的字符判断是啥,然后进行相应的判断。
但是能发现,当字符是A时,x+y= 2x+y+y =2(x+y); 当字符是B时, x+y=x+2y+x=2(x+y); 所以,无论字符是A还是B,结果都一样,因此只需要判断S有多长,然后乘以2即可。class Solution{ public int calculate(String s){ int x = 1; int y = 0; for(int i = 0;i < s.length();i++){ if(s.charAt(i) == 'A'){ x = 2*x+y; } if(s.charAt(i) == 'B'){ y = 2*y+x; } } return x+y; }}
int calculate(char* s[],sSize){ int length = sizeof(data) /sizeof(s[0]); return 1<