本文共 3275 字,大约阅读时间需要 10 分钟。
分析:奇数位的数字用来判断重复数量,偶数位的数字用来作为重复数字;然后还要连接各个子列表。
难点在于,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; } 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;} 分析:这题目让我想起了以前本科做的五子棋项目。假如说目标点的横坐标相同,或者纵坐标相同,那么就可以选择直走,假如都不同,那就斜着走,走对角线。(感觉用java写会容易一点)
解决:利用切比雪夫距离,二维数组来计算两点之间横坐标和纵坐标的差。
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;} 分析:思路挺简单,就是将数组中的每一位不断除以10(直到为0)统计次数,然后用一个计数器来存放操作次数为奇数的个数。(为什么是奇数,是因为最后一位没有算进除以10的操作次数里)
int findNumbers(int* nums, int numsSize) { int num; int total = 0; for (int i = 0; i < numsSize; i++) { num = 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;当字符是B时,x+y=x+2y,x+y+y=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; }} 转载地址:http://godh.baihongyu.com/