嵌入式全栈开发学习笔记---C语言笔试复习大全21(编程题25~30)

目录

25、实现字符串的排序。(输入hello world good,输出good hello world,其中字符串个数任意)

26、输入两个有序的字符串(从小到大),合并成一个有序的字符串。(输入cdhxyz fjln 输出cdfhjlnxyz)

27、命令行参数实现字符串排序。

28、一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序(异或)找出这两个只出现一次的数字。

29、编写一个函数来查找字符串数组中的最长公共前缀。(输入abca  abc  abca  abc  abcc 输出 abc)

30、给定一个字符串,字符串是有序的整数(位数不限)集合,逗号相连,移除相同的数字,使每个数字只出现一次,输出最终的数字个数。例如输入:0,0,1,1,1,2,2,31,31,444   输出 5


上一篇复习了数组指针和指针数组、指针的指针和命令行参数,这一节完成最后6道编程题。

说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。

这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。

注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!

vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。

我们正式开始:

25、实现字符串的排序。(输入hello world good,输出good hello world,其中字符串个数任意)

提示:先申请一个空间获取输入的字符串,每一个空格为一个字符串,然后再申请一个空间存放每一个字符串的地址,再通过指针数组中的每一个指针对每一个字符串进行排序。

参考代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>void sort(char**s, int count)
{int i,j;for(i=0;i<count-1;i++)//s中的元素{for(j=0;j<count-1-i;j++)//元素中的每一个字符{if(strcmp(s[j],s[j+1])>0){//交换地址char *t=s[j];s[j]=s[j+1];s[j+1]=t;}}}
}void save_each_str_add(char*str, char**s)
{int i=0;char*begin=str;//将字符串的地址记住//当没有遇到字符串结束标志时就继续while(*str!='\0'){if(*str==' ')//当遇到空格时就说明是一个字符串了,就给该字符串申请空间{s[i]=(char*)malloc(sizeof(char)*(str-begin));//将该字符串拷贝进刚刚申请的空间strncpy(s[i++],begin,str-begin);begin=str+1;//str指向空格后一个字符作为下一个起始位置}str++;}//当*str等于结束标志标志退出循环时,记得将最后一个字符串的地址存进去s[i]=(char*)malloc(sizeof(char)*(str-begin));strncpy(s[i++],begin,str-begin);
}int main()
{//获取输入char str[1028]={0};//数组的大小一定要写,够用就行char ch;int i=0;int count=0;//获取字符串的同时,计算单词的个数while((ch=getchar())!='\n')//只要不换行就继续获取{if(ch==' '){count++;//如果是空格就++}str[i++]=ch;//将获取到的字符依次存放到str数组中}count++;//申请一个指针数组空间char **s=(char**)malloc(sizeof(char*)*count);//有多少个字符串count就申请多大空间,申请的空间类型是char*型的地址则是char**,而存放的类型是char*//将每一个字符串的地址存放在指针数组中save_each_str_add(str,s);//将总的输入和指针数组空间的地址传过去//对s数组中的指针对字符串进行排序sort(s,count);//打印sfor(i=0;i<count;i++){printf("%s ",s[i]);}printf("\n");//释放空间for(i=0;i<count;i++){free(s[i]);}free(s);return 0;
}

运行结果:

26、输入两个有序的字符串(从小到大),合并成一个有序的字符串。(输入cdhxyz fjln 输出cdfhjlnxyz)

提示:获取两个字符串数组和一个空数组,依次比较数组1和数组2对应位置的字符大小,把小的放到数组3中,当比到其中一个数组的’\0’时,就停止比较,将另一个数组中剩下没有比较的字符直接接到数组3的字符串后面即可。

参考代码:

#include <stdio.h>
#include <string.h>void merge(char*s1, char*s2, char*s3)
{while(*s1!='\0' && *s2!='\0'){if(*s1<*s2){*s3++=*s1++;}else{*s3++=*s2++;}}if(*s1=='\0'){strcat(s3,s2);}if(*s2=='\0'){strcat(s3,s1);}
}int main()
{char s1[128]={0};char s2[128]={0};char s3[128]={0};scanf("%s %s",s1,s2);merge(s1,s2,s3);printf("%s\n",s3);return 0;}运行结果:27、命令行参数实现字符串排序。
参考代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void sort(int size, char*str[])
{int i,j;for(i=0;i<size-1;i++){for(j=0;j<size-1-i;j++){if(strcmp(str[j],str[j+1])>0){char*t=str[j];str[j]=str[j+1];str[j+1]=t;}}}
}int main(int argc, char*argv[])
{sort(argc-1, argv+1);int i,j;for(i=1;i<argc;i++){printf("%s ",argv[i]);}printf("\n");return 0;
}

运行结果:

27、命令行参数实现字符串排序。

参考代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void sort(int size, char*str[])
{int i,j;for(i=0;i<size-1;i++){for(j=0;j<size-1-i;j++){if(strcmp(str[j],str[j+1])>0){char*t=str[j];str[j]=str[j+1];str[j+1]=t;}}}
}int main(int argc, char*argv[])
{sort(argc-1, argv+1);int i,j;for(i=1;i<argc;i++){printf("%s ",argv[i]);}printf("\n");return 0;
}

运行结果:

 

28、一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序(异或)找出这两个只出现一次的数字。

提示:假设一个整型数组是:1 1 2 2 3 4

0001

0001

0010

0010

0011

0100

他们放在一起异或结果就是3^4

结果 0011 ^ 0100

0111

0111就说明了3和4的最后三位不同

取这三位中的任何一位都能计算

假设取左边开始下标为2的

所有数字中,凡是左边开始下标为二是1的放在一组

0100

凡是左边开始下标为二不是1的放在一组

0001

0001

0010

0010

0011

这两组数字,第一组全部异或 结果0100 即4

第二组全部异或 0011 即3

参考代码:

#include <stdio.h>int find_one(int r)
{int i;for(i=0;i<32;i++){if(r&1==1){return i+1;//第i+1位是1}r>>=1;//右移位继续找}return -1;
}int main()
{int i, result=0;int num1=0,num2=0;int array[10]={1,1,2,2,3,3,4,5,6,6};for(i=0;i<10;i++){result^=array[i];}//找出异或的结果为1的二进制位,然后以此为标准来分组int index=find_one(result);//从右往左开始找,如果第i+1(index)位是1则分为一组,如果是0就分为一组for(i=0;i<10;i++){//判断第index位是不是1//将每个元素的二进制位下标为index-1的位跟1相与if((array[i]>>(index-1))&1==1){//组内异或得出结果num1^=array[i];}else{num2^=array[i];}}printf("%d %d \n",num1, num2);return 0;
}

运行结果:

29、编写一个函数来查找字符串数组中的最长公共前缀。(输入abca  abc  abca  abc  abcc 输出 abc)

提示:

第一步:获取字符串:定义一个指针数组,申请一块内存,指针数组中每一个指针指向该内存,将获取到的几个字符串对应放到每一个指针所指针的内存中。

第二步:找出最短字符串:如果字符串下标为0,就计算该字符串的长度存在short_len中。如果字符串的下标不为0且如果该字符串的长度小于最小长度,就将该下标记录在min中,然后将该字符串的长度更新到short_len中。

第三步:将最短字符串和其他字符串比较,看看是否是它的最长前缀。

参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{//获取字符串char*str[5]={0};//存放5个字符串的地址//找出最短字符串int i,j;int min;//记录最短字符串的编号int short_len;//记录最短字符串的长度char sub[32]={0};//将最短字符串拷贝进去for(i=0;i<5;i++){str[i]=(char*)malloc(sizeof(char)*32);scanf("%s",str[i]);if(0==i){min=i;short_len=strlen(str[i]);}else{if(strlen(str[i])<short_len){min=i;short_len=strlen(str[i]);}}}//找出最长公共前缀//把最短字符串依次和每一个字符串比较,如果都相等,说明是公共子串,如果有一个不相等,就将最短字符串缩短一个字符,再进行对比,如此反复循环,次数等于最短字符串的长度for(i=short_len;i>=1;i--){//拷贝之前先清空掉submemset(sub,0,32);//将最短字符串拷贝到一个sub中strncpy(sub,str[min],i);//判断是不是公共子串for(j=0;j<5;j++){if(strncmp(sub, str[j],i)!=0)//i为子串的长度{break;//说明不是子串,直接跳出j这层循环,i--缩短子串的长度}}if(j==5){printf("最长公共子串是%s\n", sub);return 0;}}printf("公共子串不存在\n");return 0;
}

运行结果:

30、给定一个字符串,字符串是有序的整数(位数不限)集合,逗号相连,移除相同的数字,使每个数字只出现一次,输出最终的数字个数。例如输入:0,0,1,1,1,2,2,31,31,444   输出 5

提示:

第一步:定义两个数组,一个数组用来获取字符串,然后先将这个字符串转换成数字放在一个数组里面。atoi()函数:将字符串(以’\0’位分界面)转换成int型的数字,参数只要提供字符串的地址。

第二步:将重复的数字给去除掉,再统计个数

参考代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int str_to_int(char*str, int*array)
{char*begin=str;//记录下开始位置int i=0;//数组的下标//如果没有到'\0'就继续循环while(*str!='\0'){//如果遇到逗号就将逗号转换成'\0',分割成一个子串,然后将子串转换成int型if(*str==','){*str='\0';//转换array[i++]=atoi(begin);//更新起始位置begin=str+1;}str++;}//退出循环后不要忘记转换最后一个数字array[i]=atoi(begin);return i+1;//返转换成数字的个数
}int count_dif(int*array, int size)
{int i;int count_dif=0;for(i=0;i<size;i++){if(0==i){//数组第一个元素直接计算一次count_dif++;continue;//跳到i++}//之后只有当后一个数与前一个数不相等时才计算一次if(array[i]!=array[i-1]){count_dif++;}//如果相等就直接不计算了,继续i++}return count_dif;
}int main()
{//定义两个数组char str[128]={0};int array[128]={0};//获取一个字符串scanf("%s", str);//将字符串转换成int数字int count=str_to_int(str, array);//计算不重复的个数printf("%d\n", count_dif(array, count));return 0;
}

运行结果:

以上就是这篇内容,如想了解更多,欢迎订阅本专栏!

如有问题可评论区或者私信留言,如果想要进交流群请私信!

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

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

相关文章

1076: 判断给定有向图是否存在回路

解法&#xff1a; 直观的方法用邻接矩阵dfs,这是错误的代码 #include<iostream> #include<vector> using namespace std; int arr[100][100]; int f 0; void dfs(vector<int>& a, int u) {a[u] 1;for (int i 0; i < a.size(); i) {if (arr[u][i]…

2024 一键批量下载微博内容/图片/视频/评论/转发数据,导出excel和pdf

以李健的微博为例&#xff0c;抓取2010-2024年所有的微博数据excel&#xff0c;包含微博链接&#xff0c;微博内容&#xff0c;发布时间&#xff0c;点赞数&#xff0c;转发数&#xff0c;评论数&#xff0c;话题等。 每个月的微博转评赞总数曲线&#xff0c;2015年是高峰。 微…

Centos7静态路由和动态路由

路由&#xff0c;即路由选择&#xff08;Routing&#xff09;&#xff0c;是指在计算机网络中选择数据传输路径的过程。路由器&#xff08;Router&#xff09;是执行路由选择功能的网络设备。路由的主要目的是在复杂的网络结构中&#xff0c;选择最佳路径将数据包从源节点传递到…

自回归模型(二):具有自回归误差的回归

让我们考虑一个问题&#xff0c;其中我们有一个y变量和多个x变量&#xff0c;它们都被测量为时间序列。举个例子&#xff0c;我们可以将y设定为高速公路上每月的事故数量&#xff0c;而x则表示每月在高速公路上的交通量&#xff0c;观测时间为连续的120个月。一个多元&#xff…

使用 MPI 做 3D 带状矩阵的转置

目的&#xff1a;整个大矩阵从 [Nx, Ny, Nz] 转到 [Nz, Nx, Ny] 每个进程的输入&#xff1a;大矩阵的 [Nx / total_proc_num, Ny, Nz] 的部分 每个进程的输出&#xff1a;大矩阵的 [Nz / total_proc_num, Nx, Ny] 的部分 一开始我大概有一个想法&#xff0c;假设两个进程的话…

HTTP 请求的完整过程

HTTP 请求的完整过程 当用户在浏览器输入网址回车之后&#xff0c;网络协议都做了哪些工作呢? 首先工作的是 浏览器应用程序&#xff0c;他要解析出 URL中的域名 根据域名获取对应的ip地址&#xff0c;首先从浏览器缓存中査看&#xff0c;如下可以査看浏览器中域名对应ip的解…

想当安卓开发工程师?学习路线分享!

安卓开发学习路线 在前几篇文章中,对安卓开发岗位的岗位要求做了一些科普,本节文章将介绍安卓开发岗位的学习路线。 目前,网络上有很多面经、算法题解、算法课等学习资料,如何合理利用这些资料成为技术求职者的一大困惑。笔者整理了一份安卓开发岗位学习路线供大家参考,…

两篇文章讲透数据结构之堆(一)!

目录 1.堆的概念 2.堆的实现方式 3.堆的功能 4.堆的声明 5.堆的实现 5.1堆的初始化 5.2堆的插入 5.2.1向上调整算法 5.2.2堆的插入 5.3堆的删除 5.3.1向下调整算法 5.3.2堆的删除 5.4获取堆顶元素 5.5获取堆的元素个数 5.6判断堆是否为空 5.7打印堆 5.8建堆 …

亚马逊自养号测评环境搭建技巧:打造防关联底层环境的关键步骤

今天我们要聊的是完全由人工操作的自养号方法&#xff0c;相信有过相关经验的朋友们都清楚&#xff0c;在实现自养号的过程中&#xff0c;所使用的 IP 和浏览器究竟有哪些选择&#xff0c;以及可能会遇到哪些问题。 首先&#xff0c;我们来看看市场上现有的 IP 类型以及可能出现…

[LDAP: error code 34 - invalid DN]

目前我的项目版本&#xff1a; Spring版本:5.3.15SpringBoot版本:2.6.3 完整错误 org.springframework.ldap.InvalidNameException: [LDAP: error code 34 - invalid DN]; nested exception is javax.naming.InvalidNameException: [LDAP: error code 34 - invalid DN]at org.s…

zabbix实现企业微信机器人推送

0、前置条件 已经申请到企业微信机器人webhook&#xff0c;参考链接https://developer.work.weixin.qq.com/document/path/91770 1、创建报警媒介类型 在报警媒介类型右上角创建媒体类型 新增Token参数&#xff0c;将申请获得的Token填入 在脚本处填入脚本&#xff1a; 脚…

amtlib.dll打不开怎么办?一键修复丢失amtlib.dll方法

电脑丢失amtlib.dll文件是什么情况&#xff1f;出现amtlib.dll打不开怎么办&#xff1f;这样的情况有什么解决方法呢&#xff1f;今天就和大家聊聊amtlib.dll文件同时教大家一键修复丢失amtlib.dll方法&#xff1f;一起来看看amtlib.dll文件丢失会有哪些方法修复&#xff1f; a…

从旅游广告联想到《桃花源记》

近日收到《长江头条网》等知名网络自媒体相邀,促我写点儿旅游题材的文案。虽说笔者游历过许多名山大川的绝美风景区,但那是在70岁之前的事儿了。如今年逾78岁,纵使有少许自有资本能够支持出游,可体力难撑,岂不是花钱买罪受吗?而且,写没有亲身经历过的事挺难,即便发表出…

leetCode-hot100-数组专题之双指针

数组双指针专题 1.同向双指针1.1例题26.删除有序数组中的重复项27.移除元素80.删除有序数组中的重复项 Ⅱ 2.相向双指针2.1例题11.盛最多水的容器42.接雨水581.最短无序连续子数组 双指针在算法题中很常见&#xff0c;下面总结双指针在数组中的一些应用&#xff0c;主要分为两类…

WebGL的医学培训软件开发

开发基于WebGL的医学培训软件是一项复杂且技术性强的任务&#xff0c;需要结合医学专业知识和计算机图形学技术。以下是详细的开发流程和关键步骤。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析与定义 目标用户&#xf…

二叉树——进阶(递归创建,非递归,广度优先,翻转,深度,对称)

二叉树——进阶 二叉树的递归创建非递归前中后序遍历非递归前序遍历非递归中序遍历非递归后序遍历 广度优先遍历二叉树&#xff08;层序遍历&#xff09;翻转二叉树 二叉树深度最大深度最小深度 对称二叉树 二叉树的递归创建 1&#xff0c;二叉树是一种结构相对固定的数据&…

vue3中element-plus下拉菜单与图标的使用

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

用Python一键生成PNG图片的PowerPoint幻灯片

在当今的商业环境中,PowerPoint演示是展示和传递信息的常用方式。然而,手动将大量图像插入到幻灯片中往往是一项乏味且耗时的工作。但是,通过Python编程,我们可以轻松自动化这个过程,节省时间和精力。 C:\pythoncode\new\folderTOppt.py 在本文中,我将介绍如何使用Python、wx…

【C++初阶】vector

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

在winnas中使用docker desktop遇到的问题及解决方法记录

最近在尝试从群晖转向winnas&#xff0c;一些简单的服务依然计划使用docker来部署。群晖的docker简单易用且稳定&#xff0c;在win上使用docker desktop过程中遇到了不少问题&#xff0c;在此记录一下以供后来人参考。 一、安装docker desktop后启动时遇到无法启动docker引擎 …