C 语言初阶算法习题实战解析
这里整理了五道经典的 C 语言算法题,涵盖了数组操作、字符串处理以及位运算技巧。我们直接切入核心逻辑,看看在实际编码中如何高效解决这些问题。
一、两数之和
题目要求在一个有序数组中找到两个数,使它们的和等于目标值,并返回它们的下标(从 1 开始)。
思路很直接,双重循环遍历即可。不过要注意内存分配,因为需要返回一个动态数组。另外,如果当前数字已经大于目标值,可以直接跳过,毕竟数组是有序的。
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize) {
int* ret = (int*)malloc(sizeof(int) * numbersLen);
for (int i = 0; i < numbersLen; i++) {
if (numbers[i] > target) continue;
for (int j = i + 1; j < numbersLen; j++) {
int sum = numbers[i] + numbers[j];
if (sum == target) {
ret[0] = i + 1;
ret[1] = j + 1;
*returnSize = 2;
return ret;
}
}
}
return NULL;
}
二、珠玑妙算
这道题类似于猜数字游戏,需要统计完全匹配(位置和内容都对)和部分匹配(内容对但位置不对)的数量。
关键点在于避免重复计算。我们可以先标记完全匹配的位置,将其替换为特殊字符(如'0'),这样在后续查找部分匹配时就不会再次计入。
int* masterMind(char* solution, char* guess, int* returnSize) {
int* ret = (int*)malloc(() * );
ret[] = ; ret[] = ;
len = (solution);
( i = ; i < len; i++) {
(solution[i] == guess[i]) {
ret[]++;
solution[i] = guess[i] = ;
}
}
( i = ; i < len; i++) {
( j = ; j < len; j++) {
(solution[i] == guess[j] && solution[i] != ) {
ret[]++;
solution[i] = guess[j] = ;
;
}
}
}
*returnSize = ;
ret;
}


