질문과 시험
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. a am i"입니다.
방법 1 : 문자열을 공백으로 분리하고 문자열 배열로 변환 한 다음 StringBuilder를 만들고 다음에서 추가합니다. 마지막 문자열을 첫 번째 문자열로
방법 2 : 첫 번째 단계는 문장의 모든 문자를 뒤집는 것입니다. 예를 들어, "I am a Student"의 모든 문자를 뒤집어 ".tneduts a ma i"를 얻습니다. 이때 문장의 단어 순서가 바뀔뿐만 아니라 단어의 문자 순서도 바뀝니다. 반전. 두 번째 단계는 각 단어의 문자 순서를 바꾸는 것입니다. 그러면 "student. a am I"가 표시됩니다. 이것은 제목의 요구 사항을 충족하는 출력입니다.
주제 2 : 문자열의 왼쪽 회전 작업은 문자열 앞의 여러 문자를 문자열의 끝으로 전송하는 것입니다. 문자열의 왼쪽 회전을 실현하는 기능을 정의하십시오. 예를 들어, 문자열 "abcdefg"와 숫자 2를 입력하면 함수는 왼쪽으로 2 자리 씩 회전 한 결과 "cdefgab"를 반환합니다.
방법 1 : 각각의 법칙을 찾는 것은 쉬운 일이 아닙니다. 문자열이 회전 할 때 움직이는 문자. 그렇다면 첫 번째 문제를 해결한다는 아이디어에서 영감을 얻을 수 있습니까? 첫 번째 질문에서 "hello World"와 같이 입력 문자열에 두 단어 만 있으면이 문장의 단어 순서를 뒤집어 "world hello"를 얻습니다.이 두 문자열을 비교하면 가능하지 않습니까? "world hello"는 원래 문자열 "hello world"의 처음 몇 글자를 뒤로 옮기는 것으로 생각할 수 있습니까? 즉,이 두 문제는 매우 유사하며 문자열을 반대로하여 두 번째 문제를 해결할 수도 있습니다.
"abcdeftg"를 예로 들어 두 부분으로 나눌 수 있습니다. 처음 두 문자를 뒤에두고 싶기 때문에 처음 두 문자를 첫 번째 부분으로 나누고 다음의 모든 문자를 첫 번째 부분으로 나눕니다. 두 부분 . 먼저 두 부분을 뒤집어서 "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);
}
}