質問とテスト
package sword042;
/*题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
* 为简单起见,标点符号和普通字母一样处理。
* 例如输入字符串为“I am a Student.",则输出为”Student. a am i".
题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
请定义一个函数实现字符串左旋转的功能。
比如输入字符串”abcdefg"和数字2,该函数将返回左旋转2位得到的结果“cdefgab"
*/
public class main {
public static void main(String[] args) {
String [] testTable = {"hello","A man, a plan, a canal: Panama","I am a Student."};
for (String ito : testTable) {
test(ito);
}
String [] testTable2 = {"hello","A man, a plan, a canal: Panama","I am a Student."};
for (String ito : testTable2) {
test2(ito);
}
}
private static void test(String ito) {
Solution solution = new Solution();
String rtn;
long begin = System.currentTimeMillis();
System.out.print(ito);
System.out.println();
//开始时打印数组
rtn= solution.reverseString(ito);//执行程序
long end = System.currentTimeMillis();
System.out.println("rtn=" );
System.out.print(rtn);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
private static void test2(String ito) {
Solution solution = new Solution();
String rtn;
long begin = System.currentTimeMillis();
System.out.print(ito);
System.out.println();
//开始时打印数组
rtn= solution.leftRotateString(ito,2);//执行程序
long end = System.currentTimeMillis();
System.out.println("rtn=" );
System.out.print(rtn);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
トピック1:英語の文を入力し、文の単語の順序を逆にしますが、単語の文字の順序は変更されません。簡単にするために、句読点は通常の文字のように扱われます。たとえば、入力文字列が「I am a Student。」の場合、出力は「Student。aam i」です。
方法1:文字列をスペースで区切り、文字列配列に変換し、StringBuilderを作成して、最後の文字列から最初の文字列へ
方法2:最初のステップは、文のすべての文字を逆にすることです。たとえば、「I am a Student」のすべての文字を反転して、「。tneduts a ma i」を取得します。このとき、文の語順が逆になるだけでなく、単語の語順も逆になります。逆になりました。2番目のステップは、各単語の文字の順序を逆にすることです。「student。aam I」が表示されます。これは、タイトルの要件を満たす出力です。
トピック2:文字列の左回転操作は、文字列の前のいくつかの文字を文字列の最後に転送することです。文字列の左回転を実現する関数を定義してください。たとえば、文字列「abcdefg」と数値2を入力すると、関数は結果「cdefgab」を返します。この結果は左に2桁回転します。
方法1:それぞれの法則を見つけるのは簡単な作業ではありません。文字列が回転すると文字が移動します。それで、最初の問題を解決するというアイデアからインスピレーションを見つけることができますか?最初の質問で、入力文字列に「hello World」などの単語が2つしかない場合は、この文の語順を反転して「world hello」を取得します。これらの2つの文字列を比較すると、不可能です。 「worldhello」を元の文字列「helloworld」の最初の数文字を後ろに転送することと考えるには?つまり、これら2つの問題は非常に似ており、文字列を逆にすることで2番目の問題を解決することもできます。
「abcdeftg」を例にとると、2つの部分に分けることができます。最初の2文字を後ろに置きたいので、最初の2文字を最初の部分に分割し、後続のすべての文字を最初の部分に分割します。2つの部分。最初に2つの部分を逆にして、「bagfedc」を取得し、次に文字列全体を逆にして、元の文字列を2桁左に回転させた結果である「cdefgab」を取得します。
package sword042;
public class Solution {
public String reverseString(String s) {
String[] strings = s.split(" ");
StringBuilder builder = new StringBuilder();
for(int i=strings.length-1;i>=1;i--) {
builder.append(strings[i]);
builder.append(" ");
}
builder.append(strings[0]);
return builder.toString();
}
public String leftRotateString(String s,int index) {
int length = s.length();
s = reverse(s);
s = reverse(s.substring(0, length - index)) + reverse(s.substring(length - index, length));
return s;
}
private String reverse(String s) {
char[] array = s.toCharArray();
int i = 0;
int j = array.length -1;
while(i<=j) {
char temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
return String.valueOf(array);
}
}