本题为剑指offer面试题42——1
牛客网测试地址::https://www.nowcoder.com/questionTerminal/3194a4f4cf814f63919d0790578d51f3
[编程题]翻转单词顺序列
- 热度指数:67941 时间限制:1秒 空间限制:32768K
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
package go.jacob.day515;
public class Demo1 {
/*
* 先对str进行反转,然后再单独对每个单词进行反转
*/
public String ReverseSentence(String str) {
// 无效输入,用Str.trim()去除字符串两端的空格字符
if (str == null || str.trim().equals(""))
return str;
char[] chars = str.toCharArray();
chars = reverse(chars, 0, str.length() - 1);
int wordBegin = 0;
for (int i = 0; i < chars.length; i++) {
if (chars[i] == ' ') {
reverse(chars, wordBegin, i - 1);
wordBegin = i + 1;
}
// 反转最后一个单词
if (i == chars.length - 1)
reverse(chars, wordBegin, i);
}
// 注意:这里也可以用new String(chars),但不能用chars.toString();
return String.valueOf(chars);
}
/*
* 反转begin到end的字符顺序
*/
private char[] reverse(char[] chars, int begin, int end) {
char tmp;
while (begin < end) {
tmp = chars[begin];
chars[begin] = chars[end];
chars[end] = tmp;
begin++;
end--;
}
return chars;
}
}
题目二:左旋转字符串
牛客网测试地址:https://www.nowcoder.com/questionTerminal/85062aa6016640d188a6a0daf9f5da0e
- 时间限制:3秒 空间限制:32768K
对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。
给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。
测试样例:
"ABCDEFGH",8,4
返回:"FGHABCDE"
package go.jacob.day515;
public class Demo2 {
public String rotateString(String A, int n, int p) {
char[] chars=A.toCharArray();
chars=reverse(chars,0,n-1);
chars=reverse(chars,0,n-2-p);
chars=reverse(chars,n-p-1,n-1);
return String.valueOf(chars);
}
private char[] reverse(char[] chars, int begin, int end) {
char tmp;
while (begin < end) {
tmp = chars[begin];
chars[begin] = chars[end];
chars[end] = tmp;
begin++;
end--;
}
return chars;
}
}