【C语言进阶】指针编程题—字符串翻转
目录
写在前面
正文
练习一:左旋字符串
练习二:字符串旋转异同判断
练习三:杨氏矩阵
写在最后
写在前面
这是有关指针的大题
正文
练习一:左旋字符串
题目要求:实现一个函数,可以左旋字符串中的K个字符
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
法一:暴力旋转法
分析:为好说明情况,暂且把字符串定为abcdef,K为2,旋转步骤如下:
- 将a存到临时空间中去
- 将bcdef中的每一个字符通过循环前移一位
- 将a放到最后一位
- 将b存放到临时空间中去,重复上面的操作
#include<stdio.h>
#include<string.h>
#include<assert.h>
void left_move(char* arr, int k)
{assert(arr!=NULL);int i = 0, j = 0;int len = strlen(arr);for (i = 0; i < k; i++){char tmp = *arr;//首字符存放到临时空间for (j = 0; j <len-1; j++){*(arr + j) = *(arr + j + 1);//剩余字符前移}*(arr + len - 1) = tmp;//临时空间字符放到最后}
}
int main()
{char arr[] = { "abcdef" };left_move(arr, 2);printf("%s", arr);return 0;
}
法二:三步旋转法
分析:为好说明情况,暂且把字符串定为abcdef,K为2,旋转步骤如下:
- 将字符串的前2个字符逆置,结果为ba cdef
- 将字符串的剩余字符逆置,结果为ba fedc
- 将整个字符串逆置,结果为cdef ab
#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* left,char* right)
{assert(left != NULL);assert(right != NULL);while (left < right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}
}
void left_move(char* arr, int k)
{assert(arr);int len = strlen(arr);assert(k <= len);reverse(arr,arr+k-1);//逆序左边reverse(arr+k,arr+len-1);//逆序右边reverse(arr,arr+len-1);//逆序整体
}
int main()
{char arr[] = "abcdef";left_move(arr,2);printf("%s", arr);return 0;
}
练习二:字符串旋转异同判断
题目要求:写一个函数,判断一个字符串是否为另一个字符串旋转后的结果
例如:
s1=AABCD,s2=BCDAA,返回1
s1=abcd,s2=ABCD,返回0
法一:逐个判断法
分析:为好说明情况,暂且把字符串定为abcdef和cdefab
- 这道题的难点就是旋转的方式不确定,我们只能把字符串的所有旋转结果进行比较
- 我们使用循环将字符串abcdef旋转的所有情况与另一个字符串cdefab进行比较,比较方法可以使用上一道题的方法
- 如果有一组数据和另一字符串相同,就返回1,如果遍历所有情况后都不相同,就返回0
#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* left,char* right)
{assert(left != NULL);assert(right != NULL);while (left < right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}
}
void left_move(char* arr, int k)
{assert(arr);int len = strlen(arr);assert(k <= len);reverse(arr,arr+k-1);//逆序左边reverse(arr+k,arr+len-1);//逆序右边reverse(arr,arr+len-1);//逆序整体
}
int is_left_move(char* s1, char* s2)
{int len = strlen(s1);int i = 0;for (i = 0; i < len; i++){left_move(s1, 1);//每次在原来的基础上旋转一个int ret = strcmp(s1, s2);if (ret == 0)return 1;//只要有一组数据匹配就返回1}return 0;//能运行到这里说明穷举的旋转后的字符串都不相同
}
int main()
{char s1[] = "abcdef";char s2[] = "cdefab";int ret = is_left_move(s1, s2);if (ret == 1)printf("Yes");elseprintf("No");return 0;
}
法二:字串比较法
分析:为好说明情况,暂且把字符串定为abcdef和cdefab
- 我们将字符串写两遍,abcdefabcdef,就会惊奇的发现这个字符串囊括了字串的所有情况,我们只需将另一字符串与此字符串比较即可
- 使用strncat函数在s1的后面追加一个s1,不能使用strcat,因为不能限制个数,当自己追加自己的时候由于\0被覆盖就会因为找不到\0,而出现无限循环
- 使用strstr函数来判断s2指向的字符串是否是s1的字串
#include<stdio.h>
#include<string.h>
int is_left_move(char* s1, char* s2)
{int len1 = strlen(s1);int len2 = strlen(s2);if (len1 != len2)//应对s2字符串是s1的字串的bugreturn 0;strncat(s1, s1, len1);char* ret = strstr(s1, s2);if (ret == NULL)return 0;elsereturn 1;
}
int main()
{char s1[30] = "abcdef";char s2[] = "cdefab";int ret = is_left_move(s1, s2);if (ret == 1)printf("Yes");elseprintf("No");return 0;
}
练习三:杨氏矩阵
题目要求: 有一个矩阵,矩阵从左到右,从上到下均是递增的,请编写一个函数,查找某个数是否在矩阵中存在。要求时间复杂度小于O(n)
分析:由于要求时间复杂度小于O(n),那么就不能遍历数组来达到查找的目的,我们可以利用规律实现分行查找
- 当我们要查找的数>行末尾的数,说明这一行没有我们要找的数,就要进行下一行的寻找
- 当我们要查找的数<行末尾的数,说明这一列没有我们要找的数,就要进行前一列的寻找
- 当我们要查找的数=行末尾的数,说明就是我们要找的数,记录其下标,如果循环结束还没有找到,就返回0
#include<stdio.h>
int find(int arr[3][3],int k,int* px,int* py)
{int x=0;int y=*py-1;while( x<=*px-1 && y>=0 ){if(arr[x][y]>k)//整列都没有 y--;else if(arr[x][y]<k)//整行都没有 x++;else//找到了,就记录下标 {*px=x;*py=y;return 1;}}return 0;
}
int main()
{int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};int k=7;//查找元素 int x=3,y=3;int ret=find(arr,k,&x,&y);if(ret==1)printf("找到了,下标是(%d,%d)",x,y);elseprintf("找不到!"); return 0;
}
写在最后
【C语言进阶】指针编程题—字符串翻转相关推荐
- 浙江大学-翁凯 C语言进阶,编程题
第一周 题目: 尴尬,第一次,只通过了一个测例 #include<stdio.h> #include<string.h> int main(){char str1[10000] ...
- 沈阳师范大学大一上册C语言PTA题目集以及答案(第六章 指针 编程题篇)
沈阳师范大学大一上册C语言PTA题目集以及答案(第六章 指针 编程题篇) 7-1 输出学生成绩 (20分) 本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩.最高成绩和最低成绩.建议使用 ...
- 分析编程题c语言,二级C语言部分上机编程题详细分析
<二级C语言部分上机编程题详细分析>由会员分享,可在线阅读,更多相关<二级C语言部分上机编程题详细分析(6页珍藏版)>请在人人文库网上搜索. 1.二级C语言部分上机编程题详细分 ...
- c语言编程题库this is a c program,C语言末复习题编程题部.doc
C语言末复习题编程题部.doc 编程题目 1.在考生目录下,要求程序 PROG1.C 的功能是 按下面公式的前 1000 项,求的近似值 2 2 4 4 6 6 8 8 2n 2n * * * * * ...
- [编程题] 棋子翻转-Java
[编程题] 棋子翻转 链接:https://www.nowcoder.com/questionTerminal/b0d2c7f3a5b1429ba41997dc935f2594 来源:牛客网 时间限制 ...
- C语言课程训练系统题-字符串cqupt
C语言课程训练系统题-字符串cqupt 1.十进制转换十六进制 2.比较两个字符串的大小 3.输出最长的字符串 4.统计一个字符串在另外一个字符串出现的次数 5.有趣的"回文"检测 ...
- C语言--使用指针实现删除字符串中的空格
本篇主要实现了在C语言使用指针实现删除字符串中的空格,详细内容见下面代码,主要利用指针遍历所得到的字符串,使用一个指针指向字符串首地址,判断其是否为空格,如果是则定义一个临时指针,并遍历之后的所有字符 ...
- c++ cstring 转换 char_C语言进阶之路:字符串与整数之间的转换!
在C语言中,我们经常面临需要将字符串转换为整型,以及将整型转化为字符串的问题. 将字符串转换为整数的函数在stdlib.h中定义: int atoi(const char *str); atoi函数会 ...
- 大一下c语言期末考试编程题,大一上期末C语言编程题
大一上期末C语言编程题 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 用公式 π/4 = 1-1/3+1/5-1/7--,编程序 ...
最新文章
- 使用PostMan测试文件上传接口
- Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
- 基于KNN的相关内容推荐
- PAT甲级1060 Are They Equal:[C++题解]字符串处理、有效数字、代码简洁!!!
- STM32串口的部分映射与完全映射
- BUUCTF-Reverse:内涵的软件
- java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法
- React-引领未来的用户界面开发框架-读书笔记(一)
- 交换机开发(四)—— ARP 基础知识解析
- C++|Qt最简单的http的get请求
- leetcode 最长回文子串
- 学习腾讯的hover效果
- ListView.setAdapter(adapter);空指针异常的解决的总结
- UML图中时序图和协作图转化
- 加速转型 高通绝地反攻
- 【Unity】3.1 利用内置的3D对象创建三维模型
- 几个最新免费开源的中文语音数据集
- 手机号测性别 微信男女检测原理解析 技术分享
- 特殊句型之反义疑问句
- Kafka 数据丢失问题
热门文章
- 干货收藏 |关键词优化攻略!(附11款关键词检索工具)
- elasticsearch7.0支持同义词和自定义分词(从数据库热加载)
- cocos2d-x控制台更改精灵图片
- nslookup命令解析
- 纷纷杀入造车赛道的ICT巨头,谁会是最大赢家?
- ICML2018 | PixelSNAIL+:An Improved Autoregressive Generative Model
- xp系统远程不上服务器,WindowsXP 连接Windows 2003远程桌面 本地打印机 映射不过去 解决办法...
- 关于系统开发(软件工程框架构建)的一点迷思
- 各大电商平台商品详情api调用(api接口)、淘宝API、拼多多API、1688API
- 用OpenCV的SVM实现简单的手势识别(切水果)[附源码]