• 【面试题目】转贴-字符串反转(不包括某些特殊单词)


    字符串反转

    我没有记错的话是一道MSN的笔试题,网上无意中看到的,拿来做了一下。题目是这样的,给定一个字符串,一个这个字符串的子串,将第一个字符串反转,但保留子串的顺序不变。例如:
    输入: 第一个字符串: "This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn"
    子串: "zhuxinquan"
    输出: "nc/moc.zhuxinquan.www//:ptth :etis esenihC s'zhuxinquan si sihT"
    一般的方法是先扫描一边第一个字符串,然后用stack把它反转,同时记录下子串出现的位置。然后再扫描一遍把记录下来的子串再用stack反转。我用的方法是用一遍扫描数组的方法。扫描中如果发现子串,就将子串倒过来压入堆栈。
    最后再将堆栈里的字符弹出,这样子串又恢复了原来的顺序。源代码如下:

     1 #include <iostream>
     2 #include <cassert>
     3 #include <stack>
     4 #include <string.h>
     5 
     6 using namespace std;
     7 //reverse the string 's1' except the substring 'token'.
     8 const char* reverse(const char* s1, const char* token)
     9 {
    10     assert(s1 && token);
    11     stack<char> stack1;
    12     const char* ptoken = token, *head = s1, *rear = s1;
    13     while (*head != '\0')
    14     {
    15         while(*head!= '\0' && *ptoken == *head)
    16         {
    17             ptoken++;
    18             head++;
    19         }
    20         if(*ptoken == '\0')//contain the token
    21         {
    22             const char* p;
    23             for(p=head-1;p>=rear;p--)
    24                 stack1.push(*p);
    25 
    26             ptoken = token;
    27             rear = head;
    28         }
    29         else
    30         {
    31             stack1.push(*rear);
    32             head=++rear;
    33             //ptoken = token;
    34         }
    35     }
    36     char * return_v = new char[strlen(s1)+1];
    37     int i=0;
    38     while(!stack1.empty())
    39     {
    40         return_v[i++] = stack1.top();
    41         stack1.pop();
    42     }
    43     return_v[i]='\0';
    44     return return_v;
    45 }
    46 int main(int argc, char* argv[])
    47 {
    48     
    49     cout<<"This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn\n";
    50     cout<<reverse("This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn","zhuxinquan");
    51     return 0;
    52 }
  • 相关阅读:
    视图同义词创建
    单据打印模板默认启用打印机本身设置尺寸设置方法
    C语言结构体指针成员强制类型转换
    swoole中swoole_timer_tick回调函数使用对象方法
    利用phpspreadsheet切割excel大文件
    实例讲解如何利用jQuery设置图片居中放大或者缩小
    PHP小练习题
    html5中的progress兼容ie,制作进度条样式
    html5 图片热点area,map的用法
    详解JavaScript中的arc的方法
  • 原文地址:https://www.cnblogs.com/dracohan/p/1362609.html
Copyright © 2020-2023  润新知