《妙趣横生的算法》(C语言实现)-第10章算法设计与数据结构面试题精粹

【10-1】输入一个字符串并将它输出,以ctrl+z组合键表示输入完毕,要求将输入的字符串中多于1个的连续空格符合并为1个。

//10-1 2023年12月30日17点11分-17点18分
# include <stdio.h>
int main()
{
   
    char c;
    c = getchar();
    //scanf("%c", &c);
    int space = 0;
    while (c != EOF) {
   
        if (c == ' ') {
     //遇到空格符时统计空格数目 
            space++;
            if (space == 1) {
   
                putchar(c);
            }
        } else {
     //遇到非空格符时清零空格数目 
            space = 0;
            putchar(c);  //显示非空格符 
        }
//        不要用scanf("%c", &c);
        c = getchar();
    }
    return 0;
} 

总结:这类输入流操作的问题可以直接对输入的字符进行判断和处理,无需将输入的字符先保存在数组或者其他数据结构中,这样会非常容易解决。
【10-2】从终端输入10个整数,输出其中最大的数和次大的数。要求输入的10个整数互不相等。

//10-2 2023年12月30日17点25分-17点42分 
# include <stdio.h>
void bubble_sort(int a[], int n)
{
   
    for (int i = n-1; i > 0; i--){
   
        for (int j = 0; j < i; ++j) {
   
            if (a[j] < a[j+1]) {
   
                int tmp = a[j];
                a[j] = a[j+1];
                a[j+1] = tmp;
            }
        }
        printf("第%d次循环排序后结果:", n-i);
        for (int k = 0; k < n; k++) {
   
            printf("%3d", a[k]);
        }
        printf("\n");
    }
}
int main()
{
   
    int arr[10];  //定义一个数组
    printf("Please input 10 integers:\n"); 
    for (int i = 0; i < 10; i++) {
     //输入数据 
        scanf("%d", &arr[i]);
    }
    bubble_sort(arr, 10);  //冒泡排序
    printf("After sorting:\n");
    for (int i = 0; i < 10; i++) {
     //输出数据 
        printf("%d ", arr[i]);
    }
    printf("\nthe maxest number is %d, the other is %d\n", arr[0], arr[1]); 
    return 0;
} 
//12 43 23 13 65 17 98 45 67 88
//书上的代码
# include <stdio.h>
int main()
{
   
    int a, maxVal = -1000, secondVal = -1000;
    for (int i = 0; i < 10; i++) {
   
        scanf("%d", &a);
        if (a > maxVal) {
   
            secondVal = maxVal;
            maxVal = a;
        } else {
   
            if (a > secondVal) {
   
                secondVal = a;
            }
        }
    }
    printf("The max value is    %d\n", maxVal);  //输出最大的数 
    printf("The second value is %d\n", secondVal);  //输出次大的数 
    return 0;
} 

总结:类似上一道题,可以不用保存这10个整数,直接在数据输入的过程中加以控制和比较。
【10-3】编写一个程序,求分数序列的前50项和。

//10-3 2023年12月30日17点50分-17点56分 
# include <stdio.h> 
int main()
{
   
    double s = 0.0;
    double a = 2, b = 1;  //用浮点类型,用int结果就不一样了
    s += a / b;
    for (int i = 1; i < 50; ++i) {
   
        double tmp = b;
        b = a;
        a += tmp;
        s += a / b;
    }
    printf("sum is %g\n", s);
    return 0;
}

总结:用好数据类型,可以写成函数哦!
【10-4】编写一个函数实现字符串内容逆置,要求不另外开辟字符串空间

//10-4 2023年12月30日18点01分 
# include <stdio.h>
# include <string.h>
void reverse(char *s)
{
   
    for (int i = 0, j = strlen(s) - 1; i < j; i++, j--) {
   
        char tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
    }
}
int main()
{
   
    char s[200];
    printf("Please input a string:\n");
    gets(s);
    reverse(s);
    printf("After reversing:\n%s", s);
    return 0;
}

【10-5】编写一个程序,将两个字符串连接,要求不破坏原有字符串

//10-5 2023年12月30日18点04分-18点10分 
# include <stdio.h>
char * cnnString(char *s1, char *s2)
{
   
    char s[400];
    int len = 0;
    for (int i = 0; s1[i]; i++) {
   
        s[len++] = s1[i];
    }
    for (int i = 0; s2[i]; i++) {
   
        s[len++] = s2[i];
    }
    s[len] = '\0';
    return s;
}
//书上代码
/*char * cnnString(char *s1, char *s2)
{
    int len, len1, len2;
    char *s3;
    len1 = strlen(s1);
    len2 = strlen(s2);
    len = len1 + len2 + 1;
    s3 = (char *)malloc(len);
    for (int i = 0; i < len1; i++)
        s3[i] = s1[i];
    for (int i = 0; i < len2; i++)
        s3[i+len1] = s2[i];
    s3[len-1] = '\0';
    return s3;
}*/
int main()
{
   
    char s1[200], s2[200];
    printf("Please input a string:\n");
    gets(s1);
    printf("Please input a string:\n");
    gets(s2);
    char *s;
    s = cnnString(s1, s2);
    printf("Connecting:\n%s", s);
//    printf("%s", cnnString(s1, s2));
    return 0;
} 

总结:我自己写的代码运行时警告:返回了局部变量的地址,要注意!!这是因为在函数里创建的字符串是在栈上创建的,用动态分配,书上的代码就不会有警告。
【10-6】编写一个递归函数,求和。

//10-6 2023年12月30日18点17分-18点20分 
# include <stdio.h>
int sum(int n)
{
   
    if (n == 1)
        return 1;
    else
        return n+sum(n-1);
} 
int main()
{
   
    int n;
    printf("Please input a integer:\n");
    scanf("%d", &n);
    printf("The result is \n%d\n", sum(n));
    return 0;
} 

总结:递归函数解决问题哦。找到递归终止条件,递归函数。
【10-7】用递归方法编写一个程序,返回整型数组array中的最大值。数组array中的元素互不相等。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-30 21:44:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-30 21:44:03       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-30 21:44:03       87 阅读
  4. Python语言-面向对象

    2023-12-30 21:44:03       96 阅读

热门阅读

  1. oj 1.8编程基础之多维数组 13:图像模糊处理

    2023-12-30 21:44:03       57 阅读
  2. 单片机的最小系统

    2023-12-30 21:44:03       54 阅读
  3. Python函数中的*args,**kwargs作用与用法

    2023-12-30 21:44:03       61 阅读
  4. Jmeter学习总结(6)——Beanshell中If和For应用

    2023-12-30 21:44:03       58 阅读
  5. 编程笔记 html5&css&js 014 网页布局框架

    2023-12-30 21:44:03       61 阅读
  6. C++哈希表(unordered_map和unordered_set)

    2023-12-30 21:44:03       45 阅读
  7. ✨ 2024新年Flag ✨

    2023-12-30 21:44:03       46 阅读
  8. C复习-查缺补漏-更新中

    2023-12-30 21:44:03       65 阅读
  9. 深入理解c++ 继承

    2023-12-30 21:44:03       52 阅读
  10. LeetCode第20题 - 有效的括号

    2023-12-30 21:44:03       66 阅读
  11. 力扣labuladong——一刷day81

    2023-12-30 21:44:03       58 阅读
  12. LeetCode657. Robot Return to Origin

    2023-12-30 21:44:03       56 阅读
  13. mysql 数据查重与查重分页

    2023-12-30 21:44:03       56 阅读