字符串面试题(一)字符串逆序
字符串逆序可以说是最经常考的题目。这是一道入门级的题目,相信80%的程序员经历过这道题。给定一个字符串s,将s中的字符顺序颠倒过来,比如s="abcd",逆序后变成s="dcba"。
普通逆序
基本上没有这么考的,放在这里主要是为了和后面的原地逆序做个对比。很简单,直接分配一个与原字符串等长的字符数组,然后反向拷贝一下即可。
char* Reverse(char* s) {//将q指向字符串最后一个字符char* q = s ;while( *q++ ) ;q -= 2 ; //分配空间,存储逆序后的字符串。char* p = newchar[sizeof(char) * (q - s + 2)] ; char* r = p ;// 逆序存储while(q >= s)*p++ = *q-- ;*p = '\0' ;return r ; }
原地逆序
英文叫做in-place reverse。这是最常考的,原地逆序意味着不允额外分配空间,主要有以下几种方法,思想都差不多,就是将字符串两边的字符逐个交换,如下图。给定字符串"abcdef",逆序的过程分别是交换字符a和f,交换字符b和e,交换字符c和d。
一 设置两个指针,分别指向字符串的头部和尾部,然后交换两个指针所指的字符,并向中间移动指针直到交叉。
char* Reverse(char* s) {// p指向字符串头部char* p = s ;// q指向字符串尾部char* q = s ;while( *q )++q ;q -- ;// 交换并移动指针,直到p和q交叉while(q > p){char t = *p ;*p++ = *q ;*q-- = t ;}return s ; }
二 用递归的方式,需要给定逆序的区间,调用方法:Reverse(s, 0, strlen(s)) ;
// 对字符串s在区间left和right之间进行逆序,递归法 void Reverse( char* s, int left, int right ) {if(left >= right)return s ;char t = s[left] ;s[left] = s[right] ;s[right] = t ;Reverse(s, left + 1, right - 1) ; }
三 非递归法,同样指定逆序区间,和方法一没有本质区别,一个使用指针,一个使用下标。
// 对字符串str在区间left和right之间进行逆序 char* Reverse( char* s, int left, int right ) {while( left < right ){char t = s[left] ;s[left++] = s[right] ;s[right--] = t ;}return s ; }
不允许临时变量的原地逆序
使用异或操作
// 使用异或操作对字符串s进行逆序 char* Reverse(char* s) {char* r = s ;//令p指向字符串最后一个字符char* p = s;while (*(p + 1) != '\0')++p ;// 使用异或操作进行交换while (p > s){*p = *p ^ *s ;*s = *p ^ *s ;*p = *p-- ^ *s++ ;}return r ; }
按单词逆序
给定一个字符串,按单词将该字符串逆序,比如给定"This is a sentence",则输出是"sentence a is This",为了简化问题,字符串中不包含标点符号。
分两步
1 先按单词逆序得到"sihT si a ecnetnes"
2 再整个句子逆序得到"sentence a is This"
对于步骤一,关键是如何确定单词,这里以空格为单词的分界。当找到一个单词后,就可以使用上面讲过的方法将这个单词进行逆序,当所有的单词都逆序以后,将整个句子看做一个整体(即一个大的包含空格的单词)再逆序一次即可,如下图所示,第一行是原始字符换,第二行是按单词逆序后的字符串,最后一行是按整个句子逆序后的字符串。
代码
// 对指针p和q之间的所有字符逆序 void ReverseWord(char* p, char* q) {while(p < q){char t = *p ;*p++ = *q ;*q-- = t ;} }// 将句子按单词逆序 char* ReverseSentence(char* s) {// 这两个指针用来确定一个单词的首尾边界char* p = s ; // 指向单词的首字符char* q = s ; // 指向空格或者 '\0'while(*q != '\0'){if (*q == ''){ReverseWord(p, q - 1) ;q++ ; // 指向下一个单词首字符p = q ;}elseq++ ;}ReverseWord(p, q - 1) ; // 对最后一个单词逆序ReverseWord(s, q - 1) ; // 对整个句子逆序return s ; }
逆序打印
还有一类题目是要求逆序输出,而不要求真正的逆序存储。这题很简单,有下面几种方法,有的方法效率不高,这里仅是提供一个思路而已。
先求出字符串长度,然后反向遍历即可。
{
int len = strlen(s) ;
for (int i = len - 1; i >= 0; --i)
cout << s[i];
}
如果不想求字符串的长度,可以先遍历到末尾,然后在遍历回来,这要借助字符串的结束符'\0
void ReversePrint(const char* s) {const char* p = s ;while (*p)*p++ ;--p ; //while结束时,p指向'\0',这里让p指向最后一个字符while (p >= s){cout <<*p ;--p ;} }
对于上面第二种方法,也可以使用递归的方式完成。
{
if(*(s +1) != '\0')
ReversePrint(s + 1) ;
cout << *s ;
}
相关文章:

Java项目:在线淘房系统(租房、购房)(java+SpringBoot+Redis+MySQL+Vue+SpringSecurity+JWT+ElasticSearch+WebSocket)
源码获取:博客首页 "资源" 里下载! 该系统有三个角色,分别是:普通用户、房屋中介、管理员。普通用户的功能:浏览房屋信息、预约看房、和中介聊天、申请成为中介等等。房屋中介的功能:发布房屋信息…

Be a person
做人不能太实诚 尤其是干我们这行的 多久时间能做完 你自己心里要有个估算 然后把时间再往后延 别他妈给自己找罪受 转载于:https://www.cnblogs.com/wskgjmhh/p/4644840.html

Solr配置文件分析与验证
前面一篇开始学习solr的时候,做了个入门的示例http://6738767.blog.51cto.com/6728767/1401865。虽然可以检索出内容,但总和想象的结果有差异——比如,检索“天龙”两个字,按常规理解,就应该只出来《天龙八部》才对&am…

oracle启用归档日志
一、开启归档 1、查看归档信息 SQL> archive log list Database log mode No Archive Mode Automatic archival Disabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 244 Current log sequence …

C++派生类与基类构造函数调用次序
本文用来测试C基类和派生类构造函数,析构函数,和拷贝构造函数的调用次序。运行环境:SUSE Linux Enterprise Server 11 SP2 (x86_64) #include <iostream>using namespace std;class Base{public:Base(){cout << "Base Cons…

Java项目:在线点餐系统(java+Springboot+Maven+mybatis+Vue+mysql+Redis)
源码获取:博客首页 "资源" 里下载! 项目描述: 这是一个基于SpringBootVue框架开发的在线点餐系统。首先,这是一个前后端分离的项目。具有一个在线点餐系统该有的所有功能。 项目功能: 此项目分为两个角色&…

js 打开窗口window.open
js改变原有的地址 window.open(webPath/index?codecode,_self); 转载于:https://www.cnblogs.com/hwaggLee/p/4645680.html

中兴SDH原理介绍及中兴E300网管介绍
姓名苟忠兴培训课程中兴SDH原理介绍及中兴E300网管介绍培训心得1、 SDH概念:SDH(Synchronous Digital Hierarchy,同步数字体系)是一种将复接、线路传输及交换功能融为一体、并由统一网管系统操作的综合信息传送网络。2、 PDH缺点&…

bootstrap 冻结表格,冻结表头
需要的文件下载: bootstrap-table:https://github.com/wenzhixin/bootstrap-table bootstrap-table-fiex-column:https://github.com/wenzhixin/bootstrap-table-fixed-columns 参考来源:https://www.cnblogs.com/Kyaya/p/9004237.html 1.引入文件 2. bo…

Linux多线程与同步
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 典型的UNIX系统都支持一个进程创建多个线程(thread)。在Linux进程基础中提到,Linux以进程为单位组织操作,Linux中的线程也…

Java项目:校园外卖点餐系统(java+SSM+JSP+maven+mysql)
源码获取:博客首页 "资源" 里下载! 一、项目简述 环境配置: Jdk1.8 Tomcat8.5 mysql Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持) 项目技术: JSP Spring SpringMVC MyBatis cs…

基于css3 transform实现散乱的照片排列
分享一款基于css3 transform实现散乱的照片排列。这是一款简单零散的css3相册排列特效下载。效果图如下: 在线预览 源码下载 实现的代码。 html代码: <div class"main"><div class"pic pic1"><img src"1.jpg…

C++利用二级指针做函数形参来进行修改实参的实例分析
在学C/C的时候,我们都会了解到一级指针,int* i NULL; 和二级指针int ** pp NULL; 但是具体的一些应用我们可能很难理解,如果我们要取int*的地址,我们就需要int**,这是因为指针传递本质上还是值传递,本质很难理解&a…

SpringBoot 优雅实现超大文件上传,通用方案
通俗的说,你把要上传的东西上传,服务器会先做MD5校验,如果服务器上有一样的东西,它就直接给你个新地址,其实你下载的都是服务器上的同一个文件,想要不秒传,其实只要让MD5改变,就是对文件本身做一下修改(改名字不行),例如一个文本文件,你多加几个字,MD5就变了,就不会秒传了。分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。

robotframework - 运行报错提示 No keyword with name 'Open Browser' found.
用下面的例子为例: 1、输入以上robot脚本提示: 2、经查阅资料,大部分都使用的是selenium2 版本,无法解该的问题,目前小编使用的是selenium3,不知道selenium是哪个版本的话,用pip show selenium…

Linux从程序到进程
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 计算机如何执行进程呢?这可以说是计算机运行的核心问题。即使我们已经编写好程序,但程序是死的文本,只有成为…

struct stat结构体的详解和用法
[cpp] view plaincopy//! 需要包含de头文件 #include <sys/types.h> #include <sys/stat.h> S_ISLNK(st_mode):是否是一个连接.S_ISREG(st_mode):是否是一个常规文件.S_ISDIR(st_mode):是否是一个目录S_ISCHR(st_mode)&a…

反射setaccessible_反射技术
反射机制作用动态的加载类、动态的获取类的信息(属性,方法,构造器)动态构造对象动态调用类和对象的任意方法、构造器动态调用和处理属性获取泛型信息处理注解获取Class对象的方式有哪些?1. Class clazz Class.forName(全限定类名);2. 类名.c…

pthread_cond_wait()函数的详解
http://hi.baidu.com/tjuer/item/253cc6d66b921317d90e4483 了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 线程信号发送系统的核心,也是最难以理解的部分。 首先,让我们考虑以下情况:线程为查看已链接列表而锁定了互斥对象&#x…

CentOS7下python虚拟环境
搭建python虚拟环境 1.我们先创建一个隐藏目录 .virtualenvs,所有的虚拟环境都放在此目录下 :mkdir /root/.virtualenvs 2.安装虚拟环境 确认pip:whereis pip3 pip3 install virtualenv 安装virtualenvwrapper,为避免超时错误&…

WCDMA中的URA和LA/RA
1、关于URA的概念:URA(UTRAN Registration Area)是UTRAN内部区域的划分适用于UE处于RRC连接状态的情形,而且只能在UTRAN端使用(比如由UTRAN发起的寻呼)。一 个URA包含了一个或多个Cell,具体由决…

背景音乐的实现
通过利用Service来实现该功能将要播放的歌曲放入raw文件夹中[html] view plaincopy <strong>新建一个AudioService 类,<span style"font-family: Arial, Helvetica, sans-serif;">AudioService 类</span><span style"font-fami…

打牌软件可以控制吗_使用crm软件真的可以帮助企业省钱吗
使用crm软件真的可以帮助企业省钱吗大多数企业管理者认为:“客户关系系统有什么用?真的可以帮助企业发展吗?自己做一套excel版本不就行了”其实,不以为然,当我们去寻找用户时或者管理用户需要工作人员做一些繁琐的事情会极大的降低员工的工…

MS_SQL_获取字符串最后出现的字符串及位置
一.如:6.7.8.2.3.4.x得到最后一个.后面的字符串: declare str1 varchar(50) set str16.7.8.2.3.4.x select REVERSE(SUBSTRING(REVERSE(str1),1,CHARINDEX(.,REVERSE(str1))-1)) -------- string:x-- --------------------------------------…

redis(3)-redis基本类型
在redis安装目录下存在redis自带的客户端,启动即可使用。如果设置了密码,需要输入auth 123456进行验证。123456为密码。 redis的基本数据类型: 1.字符串类型(String) redis 127.0.0.1:6379> SET mykey "redis" OK redis 1…

虚函数与虚继承寻踪
封装、继承、多态是面向对象语言的三大特性,熟悉C的人对此应该不会有太多异议。C语言提供的struct,顶多算得上对数据的简单封装,而C的引入把struct“升级”为class,使得面向对象的概念更加强大。继承机制解决了对象复用的问题&…

信息记录拉取失败_天猫入驻为什么失败?猫店侠做详细解读
天猫入驻为什么失败?这是很多商家都想要知道的一件事情,猫店侠想说其实这也很正常,只要不是一味盲目的入驻,就还有机会。首先失败商家要看看失败的反馈内容,看看是哪方面不达标,再着重进行补充,…

Linux查看目录挂载点
用命令 df 即可 # df /var/lib/ Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 135979984 66905292 62055896 52% /加上-kh更容易看些: # df /var/lib/ -kh Filesystem Size Used Avail Use% Mounted o…

Android:你好,androidX!再见,android.support
190325 补充:莫名问题的解决 181106 补充:修改未迁移成功的三方库 1、AndroidX简介 点击查看Android文档中对androidx的简介 按照官方文档说明 androidx 是对 android.support.xxx 包的整理后产物。由于之前的support包过于混乱,所以…

设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。 本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解…