题干描述
给你一个下标从 0 开始的二维数组 variables
,其中 variables[i] = [ai, bi, ci, mi]
,以及一个整数 target
。
如果满足以下公式,则下标 i
是 好下标:
0 <= i < variables.length
((aibi % 10)ci) % mi == target
返回一个由 好下标 组成的数组,顺序不限 。
示例 1:
输入:variables = [[2,3,3,10],[3,3,3,1],[6,1,1,4]], target = 2 输出:[0,2] 解释:对于 variables 数组中的每个下标 i : 1) 对于下标 0 ,variables[0] = [2,3,3,10] ,(23 % 10)3 % 10 = 2 。 2) 对于下标 1 ,variables[1] = [3,3,3,1] ,(33 % 10)3 % 1 = 0 。 3) 对于下标 2 ,variables[2] = [6,1,1,4] ,(61 % 10)1 % 4 = 2 。 因此,返回 [0,2] 作为答案。
示例 2:
输入:variables = [[39,3,1000,1000]], target = 17 输出:[] 解释:对于 variables 数组中的每个下标 i : 1) 对于下标 0 ,variables[0] = [39,3,1000,1000] ,(393 % 10)1000 % 1000 = 1 。 因此,返回 [] 作为答案。
题干解析
我们需要判断二维数组 variables
中的每个元素是否满足如下公式:
0 <= i < variables.length
((aibi % 10)ci) % mi == target
如果满足,则该下标 i
是一个好下标,我们需要返回所有好下标的数组。
解题步骤
1.遍历每个元素:我们需要遍历variables数组中的每个元素[a_i, b_i, c_i, m_i]
2.计算中间结果
- 先计算 ai*bi%10
- 使用快速幂算法计算 (ai*bi%10)^ci%mi。
3.判断是否符合条件:如果上述计算结果等于target,则该下标是一个好下标。
4.记录好下标:将所有符合条件的下标记录到结果数组中。
5.返回结果:返回包含所有号下标的数组
代码实现
#include <stdio.h>
#include <stdlib.h>
// 快速幂模运算函数:计算 (x^y) % mod
int pow_mod(int x, int y, int mod) {
int res = 1;
while (y) {
if (y & 1) { // 如果 y 是奇数
res = (res * x) % mod;
}
x = (x * x) % mod; // 平方底数
y >>= 1; // 右移一位,相当于 y // 2
}
return res;
}
/**
* Note: The returned array must be malloced, assume caller calls free().
* 函数:找到所有符合条件的好下标
* @param variables: 二维整数数组,表示每个变量的值
* @param variablesSize: 数组variables的大小
* @param variablesColSize: 数组variables每一行的大小
* @param target: 目标值
* @param returnSize: 返回数组的大小
* @return: 返回符合条件的好下标数组
*/
int* getGoodIndices(int** variables, int variablesSize, int* variablesColSize, int target, int* returnSize) {
int *ans = (int *)malloc(sizeof(int) * variablesSize); // 分配最大可能的空间
int pos = 0; // 记录符合条件的下标个数
for (int i = 0; i < variablesSize; i++) {
int *v = variables[i];
// 计算 (a_i * b_i % 10)
int abMod10 = (v[0] * v[1]) % 10;
// 计算 ((a_i * b_i % 10)^c_i % m_i)
if (pow_mod(abMod10, v[2], v[3]) == target) {
ans[pos++] = i;
}
}
*returnSize = pos; // 设置返回的数组大小
return ans;
}
int main() {
// 示例 1
int variablesSize = 3;
int variablesColSize[] = {4, 4, 4};
int* variables[] = {
(int[]){2, 3, 3, 10},
(int[]){3, 3, 3, 1},
(int[]){6, 1, 1, 4}
};
int target = 2;
// 调用getGoodIndices函数,并获取结果
int returnSize;
int* result = getGoodIndices(variables, variablesSize, variablesColSize, target, &returnSize);
// 输出结果数组
printf("示例 1 结果: ");
for (int i = 0; i < returnSize; i++) {
printf("%d ", result[i]);
}
printf("\n");
free(result);
// 示例 2
int variables2Size = 1;
int variables2ColSize[] = {4};
int* variables2[] = {
(int[]){39, 3, 1000, 1000}
};
target = 17;
// 调用getGoodIndices函数,并获取结果
result = getGoodIndices(variables2, variables2Size, variables2ColSize, target, &returnSize);
// 输出结果数组
printf("示例 2 结果: ");
for (int i = 0; i < returnSize; i++) {
printf("%d ", result[i]);
}
printf("\n");
free(result);
return 0;
}
函数解释
1.pow_mod函数
- 使用快速幂算法计算(x^y)%mod.
- 通过不断平方底数并将指数减半来高效计算大幂次方的模运算结果。
2.getGoodIndices函数
- 遍历variables数组中的每个元素[a_i, b_i, c_i, m_i]。
- 首先计算ai*bi%10。
- 然后计算(ai*bi%10)^ci%mi,并与target进行比较。
- 如果相等,将当前下标i存入结果数组ans。
- 最后返回包含所有好下标的数组。