题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路: 先对整个string字符串进行逆序,然后对每个单词进行逆序。根据空格来确定单词的起始位置和终止位置。
即 student. a am I ---》 I ma a .tneduts ---》 I am a student.
注意点:想到直接对字符串操作不方便,将其转换为字符数组。
public class Solution {
public String ReverseSentence(String str)
{
String result = new String();//创建一个String对象,表示为一个空字符序列
if(str.length() == 0 || str == null)
return result;
//char[] s = str.toCharArray();将此字符串转换为一个新的字符数组
char [] charArray = str.toCharArray();
//注意 String有length()的方法,返回字符串长度
//所有数组都有length属性
//int length = charArray.length();数组没有length()方法!
int len = charArray.length;
reverse(charArray, 0, len-1);//先将整个字符串逆序翻转,注意数组的边界
int left = 0;
int right = 0;
for(int i = 1; i<len;i++)
{
//注意string是双引号,char是单引号!
if(charArray[i-1] != ' ' && charArray[i] == ' ')
{
right = i-1;
reverse(charArray, left, right);
}
if(charArray[i-1] == ' ' && charArray[i] != ' ')
{
left = i;
}
}
//最后一个单词的right是找不到的
if(charArray[len-1] != ' ' )
{
right = len-1;
reverse(charArray, left, right);
}
//String的构造方法摘要:String(char[] value)
//分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
//String str = "abc";等效于:
//char [] data = {'a', 'b', 'c'} String str = new String(data);
String resultString = new String(charArray);
return resultString;
}
private void reverse(char[] c, int left, int right)
{
while(left < right)
{
char temp = c[right];
c[right] = c[left];
c[left] = temp;
left++;
right--;
}
}
}
2017届电信编程题
题目描述:先输入一个数 n , n表示即将输入的 n 行字符串。编写程序,输出字符串的倒叙。
输入描述:
3
hello world.
thank you
i am a student.
输出描述:
world. hello
you thank
student. a am i
import java.util.Scanner;
public class Main_5 {
public static String strReverse(String str)
{
String result = new String();//创建一个String对象,表示为一个空字符序列
if(str.length() == 0 || str == null)
return result;
//char[] s = str.toCharArray();将此字符串转换为一个新的字符数组
char [] charArray = str.toCharArray();
//注意 String有length()的方法,返回字符串长度
//所有数组都有length属性
//int length = charArray.length();数组没有length()方法!
int len = charArray.length;
reverse(charArray, 0, len-1);//先将整个字符串逆序翻转,注意数组的边界
int left = 0;
int right = 0;
for(int i = 1; i<len;i++)
{
//注意string是双引号,char是单引号!
if(charArray[i-1] != ' ' && charArray[i] == ' ')
{
right = i-1;
reverse(charArray, left, right);
}
if(charArray[i-1] == ' ' && charArray[i] != ' ')
{
left = i;
}
}
//最后一个单词的right是找不到的
if(charArray[len-1] != ' ' )
{
right = len-1;
reverse(charArray, left, right);
}
//String的构造方法摘要:String(char[] value)
//分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
//String str = "abc";等效于:
//char [] data = {'a', 'b', 'c'} String str = new String(data);
String resultString = new String(charArray);
return resultString;
}
private static void reverse(char[] c, int left, int right)
{
while(left < right)
{
char temp = c[right];
c[right] = c[left];
c[left] = temp;
left++;
right--;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String []str = new String[n];//创建一个字符串数组
sc.nextLine();//consuming the <enter> from input above
for(int i=0; i<str.length;i++)
{
str[i] = sc.nextLine();//每一行的字符串,用str[i]保存
}
for(int j=0; j<str.length;j++)
{
System.out.println(strReverse(str[j]));
}
}
}