题目一:
题目描述:
自除数 是指可以被它包含的每一位数整除的数。
例如,128 是一个 自除数 ,因为 128 % 1 == 0, 128 % 2 == 0,128 % 8 == 0。
自除数 不允许包含 0 。
给定两个整数 left 和 right ,返回一个列表,列表的元素是范围 [left, right] 内所有的 自除数 。
解题思路:
遍历范围 [left,right] 内的所有整数,分别判断每个整数是否为自除数。
根据自除数的定义,如果一个整数不包含 0 且能被它包含的每一位数整除,则该整数是自除数。判断一个整数是否为自除数的方法是遍历整数的每一位,判断每一位数是否为 0 以及是否可以整除该整数。
遍历整数的每一位的方法是,每次将当前整数对 10取模即可得到当前整数的最后一位,然后将整数除以 10。重复该操作,直到当前整数变成 0 时即遍历了整数的每一位。
代码实现:
bool isSelfDividing(int num) { int temp = num; while (temp > 0) { int digit = temp % 10; if (digit == 0 || num % digit != 0) { return false; } temp /= 10; } return true; } int* selfDividingNumbers(int left, int right, int* returnSize) { int * ans = (int *)malloc(sizeof(int) * (right - left + 1)); int pos = 0; for (int i = left; i <= right; i++) { if (isSelfDividing(i)) { ans[pos++] = i; } } *returnSize = pos; return ans; }
结果情况:
符合题目要求,问题得到解决。
题目二:
题目描述:
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。
解题思路:
分成前缀和后缀然后相乘。
代码实现:
/** * Note: The returned array must be malloced, assume caller calls free(). */ int* productExceptSelf(int* nums, int numsSize, int* returnSize) { int L[numsSize]; // 前缀的乘积 int R[numsSize]; // 后缀的乘积 // 前缀 L[0] = 1; for(int i = 1; i < numsSize; i++) { L[i] = L[i - 1] * nums[i - 1]; } // 后缀 R[numsSize - 1] = 1; for(int i = numsSize - 2; i >= 0; i--) { R[i] = R[i + 1] * nums[i + 1]; } int* answer = (int*)malloc(sizeof(int) * numsSize); for(*returnSize = 0; *returnSize < numsSize; (*returnSize)++) { answer[*returnSize] = L[*returnSize] * R[*returnSize]; } return answer; }
结果情况:
符合题目要求,问题得到解决。
总结:
文章到这里就要告一段落了,有更好的想法或问题,欢迎评论区留言。
希望今天的练习能对您有所收获,咱们下期见!