首页 百科文章正文

C语言编程挑战,5道经典面试试题与解答

百科 2024年09月21日 06:00 136 硕恒

C语言,作为一门高级编程语言,自诞生以来就以其高效、灵活的特点,在操作系统、嵌入式系统、游戏开发等多个领域占据了重要地位,对于程序员来说,掌握好C语言不仅是提升个人技能的关键,也是进入名企的敲门砖之一,我们就来挑战5道经典的C语言面试题,看看你能答对几道?每道题都附有详细的解析和代码示例,希望能帮助大家更好地理解C语言的核心概念。

题目一:字符串反转

题目描述:编写一个函数reverse_string(char *str),功能是将传入的字符串str进行原地反转,当str为“hello”时,反转后应变为“olleh”。

解题思路:可以采用双指针法,一个指向字符串的头部,另一个指向尾部,然后交换两者所指向的字符,接着向中心移动,直至两指针相遇或交叉。

代码实现

#include <stdio.h>
#include <string.h>
void reverse_string(char *str) {
    int len = strlen(str);
    char temp;
    for (int left = 0, right = len - 1; left < right; left++, right--) {
        // 交换两个位置的字符
        temp = str[left];
        str[left] = str[right];
        str[right] = temp;
    }
}
int main() {
    char str[] = "hello";
    printf("Original: %s\n", str);
    reverse_string(str);
    printf("Reversed: %s\n", str);
    return 0;
}

题目二:斐波那契数列

题目描述:编写一个函数fibonacci(int n),计算并返回斐波那契数列第n项的值,斐波那契数列定义如下:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)n>=2)。

C语言编程挑战,5道经典面试试题与解答

解题思路:可以使用递归实现,但对于较大的n效率极低,更好的方法是使用迭代,仅需常数空间复杂度即可完成。

代码实现

#include <stdio.h>
int fibonacci(int n) {
    if (n <= 1) return n;
    int prev = 0, curr = 1;
    for (int i = 2; i <= n; i++) {
        int next = prev + curr;
        prev = curr;
        curr = next;
    }
    return curr;
}
int main() {
    int n = 10;
    printf("Fibonacci(%d) = %d\n", n, fibonacci(n));
    return 0;
}

题目三:判断字符串是否为回文串

题目描述:编写一个函数is_palindrome(const char *str),判断给定字符串str是否为回文串,所谓回文串是指正读反读都一样的字符串。

解题思路:同样可采用双指针的方法,一个从头开始遍历,另一个从尾开始,比较对应位置上的字符是否相同。

代码实现

#include <stdbool.h>
#include <stdio.h>
#include <string.h>
bool is_palindrome(const char *str) {
    int len = strlen(str);
    for (int left = 0, right = len - 1; left < right; left++, right--) {
        if (str[left] != str[right]) return false;
    }
    return true;
}
int main() {
    const char *str1 = "madam";
    const char *str2 = "test";
    printf("%s is palindrome? %s\n", str1, is_palindrome(str1) ? "Yes" : "No");
    printf("%s is palindrome? %s\n", str2, is_palindrome(str2) ? "Yes" : "No");
    return 0;
}

题目四:求最大公约数

题目描述:编写一个函数gcd(int a, int b),求两个正整数ab的最大公约数。

解题思路:利用辗转相除法(欧几里得算法),即用较大数除以较小数,再用上一步中的除数去除余数,重复此步骤直到余数为零,最后的除数即为最大公约数。

代码实现

#include <stdio.h>
int gcd(int a, int b) {
    while (a % b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return b;
}
int main() {
    int x = 60, y = 48;
    printf("GCD of %d and %d is %d\n", x, y, gcd(x, y));
    return 0;
}

题目五:查找子串

题目描述:编写一个函数strstr(const char *haystack, const char *needle),在字符串haystack中查找子串needle第一次出现的位置,如果找到则返回该位置的指针,否则返回NULL

解题思路:使用滑动窗口法,逐字符比较haystackneedle,直至匹配成功或haystack结束。

代码实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const char* strstr(const char *haystack, const char *needle) {
    int m = strlen(haystack), n = strlen(needle);
    if (n == 0) return (char *)haystack;
    for (int i = 0; i <= m - n; i++) {
        int j;
        for (j = 0; j < n; j++)
            if (haystack[i + j] != needle[j]) break;
        if (j == n) return (char *)(haystack + i);
    }
    return NULL;
}
int main() {
    const char *haystack = "hello world";
    const char *needle = "world";
    const char *result = strstr(haystack, needle);
    if (result) printf("Substring found at position: %p\n", result);
    else printf("Substring not found.\n");
    return 0;
}

就是我们精心挑选的五道C语言面试题及解答方案,通过这些练习,不仅能巩固基础知识,还能提高解决实际问题的能力,希望各位读者朋友能够有所收获!

大金科技网  网站地图 免责声明:本网站部分内容由用户自行上传,若侵犯了您的权益,请联系我们处理,谢谢!联系QQ:2760375052 沪ICP备2023024866号-3