笔试题目“翻转字符串”的实现
笔试题目
//写一个函数,将字符串翻转,翻转方式如下:“I am a student”反转成“student a am I”,不借助任何库函数。
据说这题在笔试或者面试当中,出现的频率非常高。刚好在书上也看到这题,又在博客园看到这题出现了(“发职位经典面试题”)。
作者也提示了,方法是先反转整个字符串,然后再反转字串。譬如先将“I am a student”反转为“tneduts a ma I”,然后再对每个字串(空格分割)反转一次。思想就那么简单吧。实现起来的话,我就有点凌乱了。C++没学好。伤不起。
算法
1 #include <stdio.h> 2 3 void main() 4 { 5 char str[]="I am a student"; 7 printf(str); 8 printf("\n"); 9 10 char *p,*q; 11 char temp; 12 p=q=str;14 while(*q!='\0') 15 { 16 q++; 17 } 18 q--; 19 while(p<=q) 20 { 21 temp=*p; 22 *p=*q; 23 *q=temp; 24 p++; 25 q--; 26 }//反转整个字符串 27 28 printf(str); 29 printf("\n"); 30 31 q=str;//指针指向开始位置 32 char *s,*t; 33 s=t=str; 34 while(*q!='\0') 35 { 36 if(*q==' ') 37 { 38 t--; 39 while(s<=t) 40 { 41 temp=*t; 42 *t=*s; 43 *s=temp; 44 s++; 45 t--; 46 }//反转局部字符串 47 48 s=q+1; 49 t=q; 50 }52 q++; 53 t++; 54 } 55 56 printf(str); 57 printf("\n"); 58 }
改进
运行之后,我发现是成功的。
但是怎么想都感觉有点问题,把“I am a student”换成“you are a student”果然有问题。
没有处理最后一个字串的缘故。因为我是按照
if(*q==' ')
来处理字串的,而字符串最后一个的结尾没有空格了,而是以'\0'结尾的。
最后一个字串的处理我是这样做的。
if(*q==' '||*(q+1)=='\0'){t--;if(*(q+1)=='\0')//处理最后一个字串t++;
看上去有点奇怪吧,但是确实是可以了。
代码貌似可以继续优化吧。怎么都感觉自己写的代码好烂。
代码
以下是完整代码
#include <stdio.h>void main() {char str[]="you are a student";printf(str);printf("\n");char *p,*q;char temp;p=q=str;while(*q!='\0'){q++;}q--;while(p<=q){temp=*p;*p=*q;*q=temp;p++;q--;}//反转整个字符串 printf(str);printf("\n");char *s;q=p=s=str;//指针指向开始位置while(*q!='\0'){if(*q==' '||*(q+1)=='\0'){p--;if(*(q+1)=='\0')//处理最后一个字串p++;while(s<=p){temp=*p;*p=*s;*s=temp;s++;p--;}//反转局部字符串 s=q+1;p=q;}q++;p++;}printf(str);printf("\n"); }
另外给一个我在《程序员面试宝典》看到的代码,不过这个主要采用数组处理,而且使用了库函数(strlen()),但是思想差不多吧。可以参考参考。
#include <iostram> #include <stdio.h>int main(void) {int num=-12345,j=0,i=0,flag=0,begin,end;char str[]="I am a student",temp;j=strlen(str)-1;printf(" string=%s\n",str);//第一步是进行全盘反转,将单词变成“tneduts a ma I”while(j>i){temp=str[i];str[i]=str[j];str[j]=temp;j--;i++;}printf(" string=%s\n",str);int i=0;//第二步进行部分反转,如果不是空格则开始反转单词while(str[i]){if(str[i]!=' '){begin=i;while(str[i]&&str[i]!=' '){i++;}i=i-1;end=i;}while(end>begin){temp=str[begin];str[begin]=str[end];str[end]=temp;end--;begin++;}i++;}printf(" string=%s\n",str);return 0; }
既然看到了,就应该要思考吧。仅提升..
参考《程序员面试宝典(第二版)》
开发职位经典面试题 http://www.cnblogs.com/zhangjing230/archive/2012/05/17/2505711.html
笔试题目“翻转字符串”的实现相关推荐
- php mysql笔试题_2017年最新PHP笔试题目及答案
2017年最新PHP笔试题目及答案 为了帮助同学们面试PHP工程师,以下百分网小编整理的2017年最新PHP程序员笔试题目,希望对大家有所帮助,更多信息请关注应届毕业生网! 1.用php打印出前一天的 ...
- 百度 腾讯 阿里 小米 笔试题目宝典
九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾 ...
- 百度 阿里 腾讯 BAT笔试题目
8月15日,百度2道面试题: 1.来自<编程之美>的概率题:一个桶里面有白球.黑球各100个,现在按下述规则取球:的 i .每次从通里面拿出来两个球: ii.如果取出 ...
- 九度OJ 1525 子串逆序打印 -- 2012年Google校园招聘笔试题目
题目地址:http://ac.jobdu.com/problem.php?pid=1525 题目描述: 小明手中有很多字符串卡片,每个字符串中都包含有多个连续的空格,而且这些卡片在印刷的过程中将字符串 ...
- 中国航信官笔试计算机基础,中国航信笔试题目
中国航信笔试题目 收到中国航信的offer,立刻就据了,虽然很后悔,但是只能这样了,看来跟中航信无缘了.提供经验攒人品. 笔试挺简单的,就是50分的公务员考题和50分的技术类题目,全是选择题,公务员的 ...
- 算法--------翻转字符串里的单词(Java版本)
题目: 给定一个字符串,逐个翻转字符串中的每个单词.示例 1:输入: "the sky is blue" 输出: "blue is sky the" 示例 2: ...
- C#与.NET程序员面试宝典 1.4.3 笔试(举例微软、雅虎笔试题目)
笔试主要考察应聘者掌握基础知识的扎实程度,以及解决问题的思考方式.笔试是程序员应聘过程中最关键的.也是难度最大的一个环节.在激烈的求职竞争中,想顺利漂亮地完成笔试题目.躲过面试官布下的种种" ...
- linux常用shell命令面试,shell经典笔试题目总结
shell经典笔试题目总结 守望者整理了一些高手的博客记录的shell面试题分享给大家,有些比较有意思,帮助大家面试或则学习shell编程的学习例子 一 文件内容如下: 100 a 1 ...
- leetcode 151. 翻转字符串里的单词
难度:中等 频次:69 题目: 给你一个字符串 s ,逐个翻转字符串中的所有 单词 . 单词 是由非空格字符组成的字符串.s 中使用至少一个空格将字符串中的 单词 分隔开. 请你返回一个翻转 s 中单 ...
最新文章
- Linux加密和安全
- windows2003server下能安装的MSN
- CentOS7 升级 curl 支持 HTTP2 与 TLS 1.3
- C语言求一棵二叉树所有根到叶的路径(附完整源码)
- 技术情报局(笛卡尔树)
- 可以添加自定义的Select控件
- 建筑设计 - 概念设计 - 笔记:- 第一章
- 关于文件的工具类例子
- 天津市计算机网络应用大赛,2017年天津市中等职业学校“圣纳·新道杯”技能大赛计算机应用技术技能比赛在我校开赛...
- dnf韩服服务器维护中,DNF韩服官方居然自己在服务器上开了个“私服”深渊必掉史诗...
- php连接sql数据库的方法,php连接数据库_php连接数据库的四种方法
- 火影忍者ol服务器维护中,火影忍者ol3月31日更新了什么?维护到几点?新增神无毗桥模拟战...
- 计算100以内奇数和偶数的数量
- html简单登录页面代码
- An Underwater Image Enhancement Benchmark Dataset and Beyong
- z-index取值范围
- 四天搞懂生成对抗网络(二)——风格迁移的“精神始祖”Conditional GAN
- 微信小程序注册/登陆,若依后台获取token
- 个人简历的1000+篇文章总结
- 微信开发(微信公众号)