美文网首页
【剑指Offer学习】【面试题42:翻转单词顺序vs左旋转字符串

【剑指Offer学习】【面试题42:翻转单词顺序vs左旋转字符串

作者: 果哥爸 | 来源:发表于2018-02-08 19:36 被阅读23次

题目一:

输入一个英文句子,翻转句子中单词的顺序,但单词内字啊的顺序不变。为简单起见,标点符号和普通字母一样处理。

举例说明:

例如输入字符串”I am a student. ”,则输出”student. a am I”。

解题思路:

第一步翻转句子中所有的字符。比如翻转“I am a student. ”中所有的字符得到”.tneduts a m a I”,此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。第二步再翻转每个单词中字符的顺序,就得到了”student. a am I”。这正是符合题目要求的输出。

实现代码:

···

import <Foundation/Foundation.h>

/**
// 翻转 字符串

@param string 字符串
@param stringLength 字符串 长度
@param start 翻转 起始 位置
@param end 翻转 截止 位置
*/
void reverse(char *string, int stringLength, int start, int end) {
if (string == NULL ||
stringLength == 0 ||
start < 0 ||
end > stringLength ||
start > end) {
return;
}

while (start < end) {
    char tmpChar = string[start];
    string[start] = string[end];
    string[end] = tmpChar;
    start++;
    end--;
}

}

/**
翻转 字符串

@param string 字符串
@param sringLength 字符串 长度
*/
void reverseSentence(char *string, int sringLength) {
if (string == NULL || sringLength == 0) {
return;
}

reverse(string, sringLength, 0, sringLength-1);

int start = 0;
int end = 0;

while (start < sringLength) {

    if(end == sringLength || string[end] == ' ') {
        reverse(string, sringLength, start, end - 1);
        end++;
        start = end;
    }
    else {
        end++;
    }
}

}
···

题目二:

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。


举例说明:

比如输入字符串”abcefg”和数字2,该函数将返回左旋转2位得到的结”cdefab”

*解题思路:

以”abcdefg”为例,我们可以把它分为两部分。由于想把它的前两个字符移到后面,我们就把前两个字符分到第一部分,把后面的所有字符都分到第二部分。我们先分别翻转这两部分,于是就得到”bagfedc”。接下来我们再翻转整个字符串, 得到的”cde也ab”同lj好就是把原始字符串左旋转2 位的结果。

实现代码:

/**
 // 翻转 字符串

 @param string 字符串
 @param stringLength 字符串 长度
 @param start 翻转 起始 位置
 @param end 翻转 截止 位置
 */
void reverse(char *string, int stringLength, int start, int end) {
    if (string == NULL ||
        stringLength == 0 ||
        start < 0 ||
        end > stringLength ||
        start > end) {
        return;
    }
    
    while (start < end) {
        char tmpChar = string[start];
        string[start] = string[end];
        string[end] = tmpChar;
        start++;
        end--;
    }
}

/**
 左旋转 字符串

 @param string 原始 字符串
 @param stringLength 字符串 长度
 @param rotateCount 旋转位数
 */
void leftRotateString(char *string, int stringLength, int rotateCount) {
    if (string == NULL ||
        stringLength == 0 ||
        rotateCount == 0) {
        return;
    }
    
    reverse(string, stringLength, 0, stringLength - 1);
    reverse(string, stringLength, 0, stringLength - rotateCount - 1);
    reverse(string, stringLength, stringLength - rotateCount, stringLength - 1);
}

相关文章

网友评论

      本文标题:【剑指Offer学习】【面试题42:翻转单词顺序vs左旋转字符串

      本文链接:https://www.haomeiwen.com/subject/tixxtftx.html