日期 | 是否一次通过 | comment |
---|---|---|
2019-02-09 20:20 | Y | 方法太蠢,字符串先切割再拼接 |
2019-02-10 12:20 | N | 很逗比:array.length、string.length() |
2019-05-16 12:20 | N | 没看清左旋与右旋 & n%str.length() |
题目:输出字符串循环左移n位结果
思路:
- 0 ~ n-1逆序;
- n ~ last 逆序;
- 整体逆序
1. 二分法
public class Solution {
public String LeftRotateString(String str,int n) {
if(n > str.length() || n < 0) {
return str;
}
char[] array = str.toCharArray();
reverse(array, 0, n-1);
reverse(array, n, str.length()-1);
reverse(array, 0, str.length()-1);
return new String(array);
}
private void reverse(char[] array, int sta, int end) {
while(sta < end) {
char temp = array[sta];
array[sta++] = array[end];
array[end--] = temp;
}
}
}
扩展
输出右移:
改为先整体逆序,再分别 0 ~ n-1 、 n-1 ~ last逆序英文句子按单词逆序:
改为先整体逆序,再通过寻找空格依次确定单词的起点和终点,并分别逆序
(代码来源:https://www.cnblogs.com/edisonchou/p/4823706.html)
public static string ReverseSentense(string sentense)
{
if (string.IsNullOrEmpty(sentense))
{
return null;
}
char[] array = sentense.ToCharArray();
int start = 0;
int end = array.Length - 1;
// Step1.先翻转整个句子
Reverse(array, start, end);
// Step2.再翻转句中的每个单词
start = end = 0;
while (start < array.Length)
{
if (array[start] == ' ')
{
start++;
end++;
}
else if (end == array.Length || array[end] == ' ')
{
Reverse(array, start, --end);
start = end + 1;
end++;
}
else
{
end++;
}
}
return new string(array);
}