笔试题目“翻转字符串”的实现

简介:

笔试题目

//写一个函数,将字符串翻转,翻转方式如下:“I am a student”反转成“student a am I”,不借助任何库函数。


据说这题在笔试或者面试当中,出现的频率非常高。刚好在书上也看到这题,又在博客园看到这题出现了(“发职位经典面试题”)。

作者也提示了,方法是先反转整个字符串,然后再反转字串。譬如先将“I am a student”反转为“tneduts a ma I”,然后再对每个字串(空格分割)反转一次。思想就那么简单吧。实现起来的话,我就有点凌乱了。C++没学好。伤不起。

算法
#include <stdio.h>

void main()
{
    char str[]="I am a student";
    printf(str);
    printf("\n");

    char *p,*q;
    char temp;
    p=q=str;14     while(*q!='\0')
    {
        q++;
    }
    q--;
    while(p<=q)
    {
        temp=*p;
        *p=*q;
        *q=temp;
        p++;
        q--;
    }//反转整个字符串

    printf(str);
    printf("\n");

    q=str;//指针指向开始位置
    char *s,*t;
    s=t=str;
    while(*q!='\0')
    {
        if(*q==' ')
        {
            t--;
            while(s<=t)
            {
                temp=*t;
                *t=*s;
                *s=temp;
                s++;
                t--;
            }//反转局部字符串

            s=q+1;
            t=q;
        }52         q++;
        t++;
    }

    printf(str);
    printf("\n");
}

改进

运行之后,我发现是成功的。

但是怎么想都感觉有点问题,把“I am a student”换成“you are a student”果然有问题。

没有处理最后一个字串的缘故。因为我是按照

if(*q==' ')

来处理字串的,而字符串最后一个的结尾没有空格了,而是以'\0'结尾的。

最后一个字串的处理我是这样做的。

if(*q==' '||*(q+1)=='\0')
        {
            t--;
            if(*(q+1)=='\0')//处理最后一个字串
                t++;

看上去有点奇怪吧,但是确实是可以了。

代码貌似可以继续优化吧。怎么都感觉自己写的代码好烂。

代码

以下是完整代码

已处理最后字串的完整代码

 

另外给一个我在《程序员面试宝典》看到的代码,不过这个主要采用数组处理,而且使用了库函数(strlen()),但是思想差不多吧。可以参考参考。

《程序员面试宝典》实现方法

 

既然看到了,就应该要思考吧。仅提升..

相关文章
|
存储 编译器 C语言
数组、指针练习题及解析(含笔试题目讲解)其一(上)
数组、指针练习题及解析(含笔试题目讲解)其一
105 0
|
5月前
|
C语言
C语言——oj刷题——调整数组使奇数全部都位于偶数前面
C语言——oj刷题——调整数组使奇数全部都位于偶数前面
33 1
|
5月前
|
存储 SQL 算法
LeetCode题目43:字符串相乘
LeetCode题目43:字符串相乘
|
6月前
|
机器人 Java
每日一刷《剑指offer》字符串篇之第一个只出现一次的字符
每日一刷《剑指offer》字符串篇之第一个只出现一次的字符
70 0
每日一刷《剑指offer》字符串篇之第一个只出现一次的字符
|
6月前
|
缓存
牛客网刷题总结(如何清除缓存区,字母大小写替换的两种方法,一元二次方程解的输出)
牛客网刷题总结(如何清除缓存区,字母大小写替换的两种方法,一元二次方程解的输出)
50 0
|
6月前
|
C语言
C语言第四十六弹---最快方法找到杨氏矩阵中的数下标
C语言第四十六弹---最快方法找到杨氏矩阵中的数下标
|
6月前
剑指Offer LeetCode 面试题50. 第一个只出现一次的字符
剑指Offer LeetCode 面试题50. 第一个只出现一次的字符
33 0
|
存储 Serverless
数组、指针练习题及解析(含笔试题目讲解)其一(下)
数组、指针练习题及解析(含笔试题目讲解)其一(下)
66 0
|
存储 C++
数组、指针练习题及解析(含笔试题目讲解)(二)
数组、指针练习题及解析(含笔试题目讲解)(二)
30 0