目录

写在前面

正文

练习一:左旋字符串

练习二:字符串旋转异同判断

练习三:杨氏矩阵

写在最后


写在前面

这是有关指针的大题


正文

练习一:左旋字符串

题目要求:实现一个函数,可以左旋字符串中的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语言进阶】指针编程题—字符串翻转相关推荐

  1. 浙江大学-翁凯 C语言进阶,编程题

    第一周 题目: 尴尬,第一次,只通过了一个测例 #include<stdio.h> #include<string.h> int main(){char str1[10000] ...

  2. 沈阳师范大学大一上册C语言PTA题目集以及答案(第六章 指针 编程题篇)

    沈阳师范大学大一上册C语言PTA题目集以及答案(第六章 指针 编程题篇) 7-1 输出学生成绩 (20分) 本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩.最高成绩和最低成绩.建议使用 ...

  3. 分析编程题c语言,二级C语言部分上机编程题详细分析

    <二级C语言部分上机编程题详细分析>由会员分享,可在线阅读,更多相关<二级C语言部分上机编程题详细分析(6页珍藏版)>请在人人文库网上搜索. 1.二级C语言部分上机编程题详细分 ...

  4. c语言编程题库this is a c program,C语言末复习题编程题部.doc

    C语言末复习题编程题部.doc 编程题目 1.在考生目录下,要求程序 PROG1.C 的功能是 按下面公式的前 1000 项,求的近似值 2 2 4 4 6 6 8 8 2n 2n * * * * * ...

  5. [编程题] 棋子翻转-Java

    [编程题] 棋子翻转 链接:https://www.nowcoder.com/questionTerminal/b0d2c7f3a5b1429ba41997dc935f2594 来源:牛客网 时间限制 ...

  6. C语言课程训练系统题-字符串cqupt

    C语言课程训练系统题-字符串cqupt 1.十进制转换十六进制 2.比较两个字符串的大小 3.输出最长的字符串 4.统计一个字符串在另外一个字符串出现的次数 5.有趣的"回文"检测 ...

  7. C语言--使用指针实现删除字符串中的空格

    本篇主要实现了在C语言使用指针实现删除字符串中的空格,详细内容见下面代码,主要利用指针遍历所得到的字符串,使用一个指针指向字符串首地址,判断其是否为空格,如果是则定义一个临时指针,并遍历之后的所有字符 ...

  8. c++ cstring 转换 char_C语言进阶之路:字符串与整数之间的转换!

    在C语言中,我们经常面临需要将字符串转换为整型,以及将整型转化为字符串的问题. 将字符串转换为整数的函数在stdlib.h中定义: int atoi(const char *str); atoi函数会 ...

  9. 大一下c语言期末考试编程题,大一上期末C语言编程题

    大一上期末C语言编程题 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 用公式 π/4 = 1-1/3+1/5-1/7--,编程序 ...

最新文章

  1. 使用PostMan测试文件上传接口
  2. Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
  3. 基于KNN的相关内容推荐
  4. PAT甲级1060 Are They Equal:[C++题解]字符串处理、有效数字、代码简洁!!!
  5. STM32串口的部分映射与完全映射
  6. BUUCTF-Reverse:内涵的软件
  7. java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法
  8. React-引领未来的用户界面开发框架-读书笔记(一)
  9. 交换机开发(四)—— ARP 基础知识解析
  10. C++|Qt最简单的http的get请求
  11. leetcode 最长回文子串
  12. 学习腾讯的hover效果
  13. ListView.setAdapter(adapter);空指针异常的解决的总结
  14. UML图中时序图和协作图转化
  15. 加速转型 高通绝地反攻
  16. 【Unity】3.1 利用内置的3D对象创建三维模型
  17. 几个最新免费开源的中文语音数据集
  18. 手机号测性别 微信男女检测原理解析 技术分享
  19. 特殊句型之反义疑问句
  20. Kafka 数据丢失问题

热门文章

  1. 干货收藏 |关键词优化攻略!(附11款关键词检索工具)
  2. elasticsearch7.0支持同义词和自定义分词(从数据库热加载)
  3. cocos2d-x控制台更改精灵图片
  4. nslookup命令解析
  5. 纷纷杀入造车赛道的ICT巨头,谁会是最大赢家?
  6. ICML2018 | PixelSNAIL+:An Improved Autoregressive Generative Model
  7. xp系统远程不上服务器,WindowsXP 连接Windows 2003远程桌面 本地打印机 映射不过去 解决办法...
  8. 关于系统开发(软件工程框架构建)的一点迷思
  9. 各大电商平台商品详情api调用(api接口)、淘宝API、拼多多API、1688API
  10. 用OpenCV的SVM实现简单的手势识别(切水果)[附源码]