《妙趣横生的算法》(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;elsereturn 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中的元素互不相等。

//10-7 2023年12月30日19点37分-19点51分 
# include <stdio.h>
int max(int a[], int n)  //递归方法哦!
{if (n == 1)return a[0];else //return a[n-1] >= max(a, n-1) ? a[n-1] : max(a, n-1);  //目前正确 return a[0] >= max(a+1, n-1) ? a[0] : max(a+1, n-1);
//        return a[0] >= max(a, n-1) ? a[0] : max(a, n-1);  //错误 
//        return max(a, n-1);  //错误 
}
int main()
{int n;printf("Please input a integer:\n");scanf("%d", &n);int arr[n];printf("Please %d numbers:\n", n);for (int i = 0; i < n; i++) {scanf("%d", &arr[i]);}printf("The maxValue is\n%d\n", max(arr, n));return 0;
} 

【10-8】用递归方法解决输出字符串。
看到这个题目时,我感觉不使用递归的话,应该很好输出。本题的输出结果其实就是这个小写字符串与它对应的大写字符串的逆序交叉输出。使用递归方法的话,终止条件应该是只包含一个小写字母,那么输出两个字母;如果是包含n个小写字母呢?
想法:n个小写字母其实就是一个小写字母循环,规律呢?

//10-7 2023年12月30日19点52分-20点16分 
# include <stdio.h>
# include <string.h>
char upper(char c)  //将小写字母转换为大写字母 
{return (c-'a'+'A');
}
//void func(char *s, int n)  //错误 
//{
//    if (n == 1) {
//        printf("%c%c", s[strlen(s)-n]-32, s[n-1]);
//    } else {
//        func(s, n-1);
//    }
//}
void func(char *str, int n, int i)  //递归法按要求格式输出字符串 
{if (i < n) {printf("%c%c", upper(str[n-i-1]), str[i]);func(str, n, i+1);}
}
int main()
{char s[200];printf("Please input a string:\n");  //输入字符串 scanf("%s", s);printf("The result is\n");func(s, strlen(s), 0);  //调用递归函数func() return 0;
} 

总结:这道题目还是有些难思考到。
【10-9】递归方法实现字符串内容就地逆置。

//10-9 2023年12月30日20点19分-20点27分 
# include <stdio.h>
# include <string.h>
void reverse(char *s, int n, int i)
{
//    if (n == 1) {  //错误 
//        printf("%c", s[n-1]);
//    } else {
//        reverse(s, n-1);
//    }if (i < n) {  //目前正确 printf("%c", s[n-1-i]);reverse(s, n, i+1);}
}
int main()
{char s[200];printf("Please input a string:\n");gets(s);printf("The result is\n");reverse(s, strlen(s), 0);return 0;
} 
//10-9 书上代码 
# include <stdio.h>
# include <string.h>
void reverser(char *s, int n, int i)
{if (i < n) {char tmp = s[n];  //字符的置换 s[n] = s[i];s[i] = tmp;reverser(s, n-1, i+1);  //递归调用函数reverser() }
}
void reverse(char *s)
{reverser(s, strlen(s)-1, 0);  //调用递归函数 
}int main()
{char s[200];printf("Please input a string:\n");gets(s);reverse(s);printf("The result is\n%s", s);return 0;
} 

总结:要与题目要求的接口一致哦!!
【10-10】编程计算可以制作出多少种水果拼盘。

//10-10 2023年12月30日20点34分-20点42分
# include <stdio.h> 
void func(int n)
{switch(n) {case 0: printf("apple "); break;case 1: printf("orange "); break;case 2: printf("banana "); break;case 3: printf("pineapple "); break;case 4: printf("pear "); break;}
}
int fruitPlate()
{int count = 0;for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {if (j == i) {continue;}for (int k = 0; k < 5; k++) {if (k == j || k == i) {continue;}count++;func(i);func(j);func(k);printf("\n");}}}return count;
}
int main()
{printf("There are %d kinds of methods for arranging plate.", fruitPlate());return 0;
}

总结:穷举法。写成函数然后调用哦!
【10-11】请在屏幕上输出一张乘法口诀表。

//10-11 2023年12月30日20点43分-20点46分 
# include <stdio.h>
void func()
{for (int i = 1; i < 10; i++) {for (int j = 1; j <= i; j++) {printf("%d*%d=%2d  ", j, i, j*i);}printf("\n");}
}
int main()
{func();return 0;
} 

【10-12】编程找出一个数字。

//10-12 2023年12月30日20点47分-20点50分 
# include <stdio.h>
# include <math.h>
int is_square(int n)  //判断完全平方数函数
{int r = sqrt(n);if (r * r == n) {return 1;} else {return 0;}
}
int func(void)
{for (int i = 1; ; i++) {  //穷举法找数字if (is_square(i+100) && is_square(i+168)) {return i;}}
}
int main()
{printf("The number is %d", func());return 0;
} 

【10-13】求和。

//10-13 2023年12月30日20点53分-20点57分 
# include <stdio.h>
int sum(int num, int t)
{int s = 0, r = 0;for (int i = 1; i <= num; i++) {r = r * 10 + t;s += r;}return s;
}
int main()
{printf("Please input n and a:\n");int n, a;scanf("%d %d", &n, &a);printf("The result is\n%d", sum(n, a));return 0;
} 

【10-14】设计一个递归算法将一个整数n转换成字符串。

//10-14 2023年12月30日20点58分-
# include <stdio.h>
# include <malloc.h>
/*char *func(int num)  //非递归做法 
{int tmp = num, k = 0;if (tmp == 0) {k = 1;}while (tmp) {k++;tmp /= 10;}char *ret = (char *)malloc(sizeof(char)*(k+1));
//    char ret[100];ret[k] = '\0';if (num == 0) {ret[0] = '0';}while (num) {ret[k-1] = num % 10 + '0';num /= 10;--k;}return ret;
}*/
//书上代码
void trans(int n)
{int i = n % 10;  //得到整数n的个位数字if (n/10 > 0)trans(n/10);  //递归调用trans,将高位数转换为字符串printf("%c", i + '0'); 
} 
int main()
{int n;printf("Please input a integer:\n");scanf("%d", &n);
//    printf("The result is\n%s", func(n));printf("The result is\n");trans(n);return 0;
} 

总结:用递归方法还是不熟练,写不出来。
【10-16】编程实现字符串复制。

//10-16 2023年12月30日21点11分-21点16分 
# include <stdio.h>
void mystrcpy(char *str, char *ret)
{/*int i;for (i = 0; str[i]; i++) {  //逐个字符复制 ret[i] = str[i];}ret[i] = '\0';*/int i = 0;while (str[i]) {*(ret+i) = *(str+i);  //复制字符串 i++;  //指针后移 }ret[i] = '\0';  //目的字符串的末尾要添加字符串结束标志'\0' 
}
int main()
{char s[200], t[200];printf("Please input a string:\n");//scanf("%s", s);gets(s);mystrcpy(s, t);printf("The result is\n%s", t);return 0;
} 

【10-17】编写一个函数loopMove(char *str, int n)实现字符串的循环右移功能。
自己有点想不出来诶!
书上分析,每次取字符串尾部一个字符保存到临时变量,然后将字符串前面的所有字符右移一位,然后将临时变量中存放的字符复制到字符串的首部,如此循环n次。

//10-17 2023年12月30日21点19分-21点27分 
# include <stdio.h>
# include <string.h>
void loopMove(char *str, int n)
{int strLength = strlen(str);for (int i = 0; i < n; i++) {char tmp = str[strLength - 1];  //取出字符串的最后一个元素 for (int j = 0; j < strLength - 1; j++) {str[strLength-j-1] = str[strLength-j-2];  //前面的元素后移 }str[0] = tmp;  //将原字符串尾部的元素放在字符串首部 }
}
int main()
{char s[200];printf("Please input a string:\n");gets(s); int n;printf("Please input a integer:\n");scanf("%d", & n);loopMove(s, n);printf("The result is\n%s", s);return 0;
} 

【10-18】找出01字符串中0和1连续出现的最大次数。

//10-18 2023年12月30日21点36分- 21点52分
# include <stdio.h>
void getMax(char *str, int *max0, int *max1)
{int cnt_0 = 0, cnt_1 = 0;if (str[0] == '0') {cnt_0++;} else {cnt_1++;}for (int i = 1; str[i]; i++) {if (str[i] == str[i-1]) {if (str[i] == '0') {cnt_0++;} else {cnt_1++;}} else {if (str[i] == '0') {if (cnt_1 > *max1) {*max1 = cnt_1;cnt_1 = 0;}cnt_0++;} else {if (cnt_0 > *max0) {*max0 = cnt_0;cnt_0 = 0;}cnt_1++;}}}if (cnt_1 > *max1) {*max1 = cnt_1;}if (cnt_0 > *max0) {*max0 = cnt_0;}
}
int main()
{char s[200];printf("Please input a string:\n");scanf("%s", s);int max0 = 0, max1 = 0;getMax(s, &max0, &max1);printf("max0 = %d, max1 = %d", max0, max1);return 0;
}

总结:函数中返回两个变量的值,用指针传递。
【10-19】编程计算该数列第20项的值。

//10-19 2023年12月30日21点55分-22点00分 
# include <stdio.h>
/*int func(int num)
{int tmp = 1;for (int i = 2; i <= num; i++) {if (i % 2 == 0) {tmp = tmp * 2 + 1;} else {tmp *= 2;}}return tmp;
}*/
//书上代码
unsigned long func(int num)
{if (num == 1)return 1;if (num % 2 == 0)return 2*func(num-1)+1;elsereturn 2*func(num-1);
} 
int main()
{printf("Please input n:\n");int n;scanf("%d", &n);
//    printf("The result is\n%d", func(n));printf("The result is\n%ld", func(n));return 0;
} 

总结:递归函数。还有注意数据的范围。
【10-20】计算这位集邮爱好者集邮总数是多少?以及每册中各有多少邮票?

//10-20 2023年12月30日22点04分-22点07分 
# include <stdio.h>
int main()
{int x;for (int y = 1; y < 7; y++) {if (303*7*10 % (56-10*y) == 0) {x = 303*7*10 / (56-10*y);break;}}printf("x = %d, A = %d, B = %d, C = 303", x, x/5, x-x/5-303);return 0;
} 

【10-21】编写递归算法,计算出每个人的年龄。

//10-21 2023年12月30日22点09分-22点14分 
# include <stdio.h>
int func(int num)
{if (num == 1) {  //第一个人10岁 return 10;} else {return 2+func(num-1);  //第n个人的年龄比第n-1人的年龄大2岁 }
}
int main()
{for (int i = 1; i <= 5; i++) {printf("Age %d: %d\n", i, func(i));} return 0;
} 

【10-22】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库设计和SQL基础语法】--用户权限管理--数据备份和恢复策略

一、引言 数据备份和恢复是数据库管理中至关重要的任务&#xff0c;对于确保数据安全性和业务连续性具有重大的意义。以下是一些关键的重要性方面&#xff1a; 防止数据丢失&#xff1a; 数据备份是防止因硬件故障、人为错误、恶意攻击或其他意外事件导致数据丢失的主要手段。…

<软考高项备考>《论文专题 - 37 采购管理(1) 》

1 成本管理基础 1.1 写作要点 过程定义、作用写作要点、思路规划采购管理规划采购管理是记录项目采购决策、明确采购方法&#xff0c;及识别潜在卖方的过程。作用:确定是否从项目外部获取货物和服务&#xff0c;如果是&#xff0c;则还要确定将在什么时间、以什么方式获取什么…

16. Mysql 自定义函数

文章目录 概述常见操作创建自定义函数自定义函数局部变量定义和赋值查看自定义函数删除自定义函数使用自定义函数 扩展-流程控制精选示例总结参考资料 概述 自定义函数&#xff0c;顾名思义就是是MySQL中用户自定义的函数&#xff0c;用于执行特定的操作或计算&#xff0c;并返…

项目实战--Message Queue

一. 概念篇 我们在学习多线程的时候,学习过生产者-消费者模型,为了实现解耦合和削峰填谷,引入了阻塞队列. 在实际的后端开发中,跨主机之间使用生产者消费者模型,也是非常普遍的需求,因此,阻塞队列会被封装成一个独立的服务器程序,实现更丰富的功能.这样的程序称为"消息队列…

GTK4 环境配置

1 安装gtk4包裹: # sudo yum install gtk4 gtk4-devel gtk4-devel-docs devhelp glib2 glib2-devel glib2-doc 2 安装 glade 4 git clone https://github.com/ag-python/cambalache.git 记住 把软件目录 复制到 一个你不会移动删除的地方(千万别删除这个软件文件夹 因为运行…

面试要点,算法,数据结构等练习大全

有趣的算法&#xff0c;面试常常碰到&#xff0c;多种语言实现~ 1 从数组中找出两个数字使得他们的和是给定的数字 tags: #hash 使用一个散列&#xff0c;存储数字和他对应的索引。然后遍历数组&#xff0c;如果另一半在散列当中&#xff0c;那么返回 这两个数的索引&#x…

Grafana监控数据可视化

Grafana 是一个可视化面板&#xff0c;有着非常漂亮的图表和布局展示&#xff0c;功能齐全的度量仪表盘和图形编辑器&#xff0c;支持 Graphite、zabbix、InfluxDB、Prometheus、OpenTSDB、Elasticsearch 等作为数据源&#xff0c;比 Prometheus 自带的图表展示功能强大太多&am…

LeetCode第69题 - x 的平方根

题目 解答 方案一 class Solution {public int mySqrt(int x) {if (x 0) {return 0;}if (x < 4) {return 1;}for (int i 2, length Math.min(46342, x / 2 2); i < length; i) {int value i * i;if (value x) {return i;}if (value > x || value < 0) {re…

MySQL中常用的数据类型

整型 int 有符号范围: -2147483648 ~ 2147483647 int unsigned 无符号范围: 0 ~ 4294967295 int(5) zerofill 仅用于显示&#xff0c;当不满足5位时&#xff0c;按照左边补0&#xff0c;例如: 00002满足时&#xff0c;正常显示 tinyint[(m)] [unsigned] [zerofill] 有符号&a…

运行时错误‘53’文件未找到:MathPage.WLL,安装MathType后Word不能复制粘贴问题的解决

两步解决&#xff1a; 1. 打开Word-->文件-->选项-->信任中心-->信任中心设置-->受信任位置&#xff0c;解决宏问题 添加如下受信任位置&#xff0c; 我的路径&#xff1a;C:\Program Files\Microsoft Office\root\Office16\STARTUP\ 2. 找到MathType下的MathT…

Unity关于动画混合树(Blend Tree)的使用

在动画与动画的切换过程中&#xff0c;常因为两个动画之间的差距过大&#xff0c;而显得动画的切换很不自然。 这时候就需要动画混合树Blend Tree这个功能。使用混合树可以将多个动画混合在一起&#xff0c;例如在处理角色的移动中&#xff0c;走动画与跑动画切换的时候&#x…

数据结构算法-穷举搜索算法

引言 穷举搜索是一种基本的搜索策略&#xff0c;其基本思想是逐一检查所有可能的解&#xff0c;直到找到一个有效的解或确定不存在解为止。在现实生活中&#xff0c;穷举搜索的应用非常广泛&#xff0c;以下是一些例子&#xff1a; 密码破解&#xff1a;在密码学中&#xff0…

vue3引入百度地图(两种方法)

首先要有百度开放平台并进行注册&#xff0c;不懂看这里 ### 第一种方法 地图引入流程 安装vue-baidu-map-3x插件 参考官网地址&#xff1a;快速上手 | vue-baidu-map-3x npm install vue-baidu-map-3x --save 在public/index.html文件中引入 <!-- 百度地图 --> &…

pytorch03:transforms常见数据增强操作

目录 一、数据增强二、transforms--Crop裁剪2.1 transforms.CenterCrop2.2 transforms.RandomCrop2.3 RandomResizedCrop2.4 FiveCrop和TenCrop 三、transforms—Flip翻转、旋转3.1RandomHorizontalFlip和RandomVerticalFlip3.2 RandomRotation 四、transforms —图像变换4.1 t…

HarmonyOS4.0系统性深入开发09卡片使用动效能力

卡片使用动效能力 ArkTS卡片开放了使用动画效果的能力&#xff0c;支持显式动画、属性动画、组件内转场能力。需要注意的是&#xff0c;ArkTS卡片使用动画效果时具有以下限制&#xff1a; 名称参数说明限制描述duration动画播放时长限制最长的动效播放时长为1秒&#xff0c;当…

【华为数据之道学习笔记】8-3异常数据监控

质量控制是通过监控质量形成过程&#xff0c;消除全过程中引起不合格或不满意效果的因素&#xff0c;以达到质量要求而采用的各种质量作业技术和活动。要保证最终交付质量&#xff0c;必须对过程进行质量控制&#xff0c;通常是在过程中设置关键质量控制点。例如&#xff0c;可…

Dockerfile学习文档

Dockerfile详解 Dockerfile是一个组合映像命令的文本&#xff1b;可以使用在命令行中调用任何命令&#xff1b;Docker通过dockerfile中的指令自动生成镜像。 通过docker build -t repository:tag ./ 即可构建&#xff0c;要求&#xff1a;./下存在Dockerfile文件 之前我们聊的…

SpringMVC源码解析——DispatcherServlet的逻辑处理

DispatcherServlet类相关的结构图如下&#xff1a; 其中jakarta.servlet.http.HttpServlet的父类是jakarta.servlet.GenericServlet&#xff0c;实现接口jakarta.servlet.Servlet。我们先看一下jakarta.servlet.Servlet接口的源码如下&#xff1a; /*** 定义所有servlet必须实…

PHP8的JIT(Just-In-Time)编译器是什么?

PHP8的JIT&#xff08;Just-In-Time&#xff09;编译器是什么&#xff1f; PHP8是最新的PHP版本&#xff0c;引入了JIT&#xff08;Just-In-Time&#xff09;编译器&#xff0c;以进一步提高性能和执行速度。 JIT编译器是一种在运行时将解释性语言转化为机器码的技术。在过去…

【网络安全】网络隔离设备

一、网络和终端隔离产品 网络和终端隔离产品分为终端隔离产品和网络隔离产品两大类。终端隔离产品一般指隔离卡或者隔离计算机。网络隔离产品根据产品形态和功能上的不同&#xff0c;该类产品可以分为协议转换产品、网闸和网络单向导入产品三种。 图1为终端隔离产品的一个典型…