【面试题总结】2、反转字符串的几种形式

反转字符串:

作为面试题出现频率最高的手写代码题,有必要做一下总结。

【形式1】:

题目:

/*
反转字符串-1:
orgin = "where‘d you go?"
dest = "?og uoy d‘erehw"
*/

分析:很容易的题目。解决方法有2种:可以递归输出、也可以“头尾”指针向中间移动,边移动变交换。

代码实现:(vs2017下测试通过)

 1 #include<iostream>
 2 using namespace std;
 3
 4 void reserve01(char *origin)
 5 {
 6     if (*origin == ‘\0‘)
 7     {
 8         return;
 9     }
10     else
11     {
12         reserve01(origin + 1);
13         cout << *origin ;
14     }
15 }
16
17 void reserve02(char origin[], int length)
18 {
19     char *head = origin;
20     char *tail = origin + length - 1;
21     while (head != tail)
22     {
23         char temp = *head;
24         *head = *tail;
25         *tail = temp;
26         head ++;
27         tail--;
28     }
29 }
30
31 int main()
32 {
33     char origin[] = "where‘d you go?";
34
35     // 方法1:采用递归的方式直接输出
36     reserve01(origin);
37     cout << endl;
38
39     // 方法2:在origin上直接逆置
40     reserve02(origin, 15);
41
42     // 输出方法2的返回值
43     cout << origin << endl;
44
45     system("pause");
46     return 0;
47 }

【形式2】:

题目:

/*
反转字符串-2:
orgin = "where‘d you go?"
dest = "d‘erehw uoy ?og"
*/

分析过程:如图所示,

代码实现:(vs2017下测试通过)

 1 #include<iostream>
 2 using namespace std;
 3
 4 void reserverOneWord(char *r, char *p)
 5 {
 6     while (r < p)
 7     {
 8         char temp = *r;
 9         *r = *p;
10         *p = temp;
11         r++;
12         --p;
13     }
14 }
15
16 void reserverString(char *str)
17 {
18     char *p, *q, *r;
19
20     p = str;
21     while (*p == ‘ ‘)                        // 让 p r指向第一个非空格的字符,为了处理“  hello world”这种情况
22         ++p;
23     if (*p == ‘\0‘)                            // 为了处理"             "这种情况
24         return;
25
26     r = p;
27     q = p + 1;
28
29     while (*q != ‘\0‘)
30     {
31         if ((*p >= ‘a‘ && *p <= ‘z‘) && (*q == ‘ ‘))
32         {
33             reserverOneWord(r, p);        // 反转 r到p这部分
34
35             while (*q == ‘ ‘)
36                 ++q;
37             if (*q == ‘\0‘)                        // 为了处理"  hello world                   "这种情况
38                 return;
39             r = q;
40             p = q;
41             q++;
42         }
43         else
44         {
45             ++q;
46             ++p;
47         }
48     }
49     reserverOneWord(r, p);            // 此时q指向 \0,需要反转r到p位置的字符串
50 }
51
52 int main()
53 {
54     // 测试用例
55     // char str[] = "where‘d go?";
56     //char str[] = "hello world!";
57     //char str[] = "  hello world                       ";
58     char str[] = "      ";
59
60     reserverString(str);
61     cout << str;
62
63     system("pause");
64     return 0;
65 }

【形式3】:

题目:

(未完待续...)

原文地址:https://www.cnblogs.com/xuelisheng/p/10987249.html

时间: 2024-10-05 20:59:56

【面试题总结】2、反转字符串的几种形式的相关文章

c语言之利用指针复制字符串的几种形式

第一种: #include<stdio.h> #include<iostream> void copy_string(char* p1, char* p2) { for (; *p1 != '\0'; *p1++,*p2++) { *p2 = *p1; } *p2 = '\0'; } int main() { char* str1 = (char*) "hello world"; char str2[] = "i am a student";

按单词(word)反转字符串(string)输出(output)——不用额外缓存(without a buffer)

一道笔试题,纸上写的,誊到电脑上并调试通过并改善. 没经验,菜鸟摸索的野蛮算法,不知道有没有更简洁更抽象的算法. 打算用现成字符串操作函数的请绕行搜索. 原题是不用buffer(缓存)反转字符串打印输出,受OJ的毒害,我就认为只要逆序打印就行了(要是把原字符串改了,我还真不知道怎么办到,尤其听说字符串常量不能被更改,在文章尾部会做验证). v0.1: 用了一下递归,思路是用指针遍历字母,每碰到空格就用新指针往下递归调用一次,碰到结束符呢,就结束呗.有两个细节,如果空格之后还是空格呢?所以你需要指

反转字符串

问题: 1.反转字符串,比如str=“hello world!!!",反转后ret=“!!!dlrow olleh"; 代码如下: #include <stdio.h> #include <stdlib.h> char* reverse(char inp[],int size){ if(size<0) return NULL; //NULL代表空地址,null只是一个符号 int i=0,j=size-1; while(i<j){ char tmp=

[算法] C# Revert 单词反转字符串[低时间复杂度]

无聊期间想起了一道字符串反转的问题. 大致要求输入"I am a good boy",输出"boy good a am I". 要求不能用已经封装好的方法实现.于是乎,我上网查了一下,基本都是用了封装后类库.于是我自己写了一个小算法,低时间复杂度高空间复杂度的算法. private string Revert(string str) { if (str.Length == 0) { return string.Empty; } string newStr = nul

345. 反转字符串中元音字母的位置 Reverse Vowels of a String

Write a function that takes a string as input and reverse only the vowels of a string. Example 1:Given s = "hello", return "holle". Example 2:Given s = "leetcode", return "leotcede" 题意:反转字符串中元音字母的位置 方法1:用栈保存元音字符串,时间

C# 反转字符串方法

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 反转字符串 { class Program { static void Main(string[] args) { string ss = Reserver("abcdefg"); Console.Write(ss); //数组里面有一个方法用来反转的 除了今天上午用到这个还可以用这个 } ///

Java反转字符串

前几天看见一篇文章,说使用Java能用几种方式反转一个字符串.首先要明白什么叫反转字符串,就是将一个字符串到过来啦,比如"倒过来念的是小狗"反转过来就是"狗小是的念来过倒".接下来就把自己能想到的所有方式记录下来了. 1.第一个念头就是直接使用String类的反转方法,对不起,这样是不行的,因为String类没有这个方法.那么好吧,搞个数组,然后遍历数组,依次调换数组中对应的各个字符. // 直接使用数组首位调换 public String reverse1(Str

java面试题,将String字符串转换成数字

题目要求:将String字符串转换成数字,不能用java自带的方法转换字符串,要求自己写一个atoi(String s),如果输入的不是数字则返回0. import java.util.Scanner; /** * Created by Dell on 2014/7/14. * * 面试题 * 将字符串转换成数字,不用java自带的方法 */ public class MianShi_01 { public static void main(String[] args) { Scanner in

【LeetCode-面试算法经典-Java实现】【152-Reverse Words in a String(反转字符串中的单词)】

[152-Reverse Words in a String(反转字符串中的单词)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given an input string, reverse the string word by word. For example, Given s = "the sky is blue", return "blue is sky the". 题目大意 给定一个字符串,将其反转,其的字词不转 解题思路