📜个人简介 |
⭐️个人主页:摸鱼の文酱博客主页🙋♂️
🍑博客领域:java编程基础,mysql
🍅写作风格:干货,干货,还是tmd的干货
🌸精选专栏:【Java】【mysql】 【算法刷题笔记】
🎯博主的码云gitee,平常博主写的程序代码都在里面。
🚀支持博主:点赞👍、收藏⭐、留言💬
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
原题链接
题目描述
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
解题思路
1.先对整体数据进行逆置
2.然后对每个单词进行逆置
我的代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
//String s = "i like beijng";
char[] chars = s.toCharArray();
int l = 0;
int r = chars.length-1;
//先对整体逆置
while(l < r){
char tmp = chars[l];
chars[l] = chars[r];
chars[r] = tmp;
l++;
r--;
}
int last=0;
int fast=0;
//对单词逐个逆置 但是无法逆置最后一个单词,
while(fast < chars.length-1){
if(chars[fast] == ' '){
last = fast+1;
fast = last;
}
//在fast指向最后一个字符时退出循环,还未来得及队最后一个字符串逆置
//此时last指向最后一个单词的首字符,fast指向最后一个单词的尾字符
if(fast==chars.length-1){
break;
}
//逆置最后一个单词时,继续下去会造成越界
if(chars[fast+1] == ' '){
int cur = fast;
while(last < fast){
char tmp = chars[last];
chars[last] = chars[fast];
chars[fast] = tmp;
last++;
fast--;
}
fast = cur;
}
fast++;
}
//对最后一个单词逆置
while(last < fast){
char tmp = chars[last];
chars[last] = chars[fast];
chars[fast] = tmp;
last++;
fast--;
}
for(char c :chars){
System.out.print(c);
}
}
}
可以将逆置过程封装为一个函数来简化代码
import java.util.*;
public class Main {
//对[start,end]范围内的字符串进行整体逆置
public static void reverse(char[] array,int start,int end) {
while(start < end) {
char tmp = array[start];
array[start] = array[end];
array[end] = tmp;
start++;
end--;
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
char[] ch = s.toCharArray();
int len = ch.length;
//1、整体进行了逆置
reverse(ch,0,len-1);
int i = 0;//遍历ch数组
while( i < len ) {
int j = i;
//找到每一个单词结尾(即不越界的情况下,下一个字符是' ')
while(j < len && ch[j] != ' ') {
j++;
}
if(j < len) {
//逆置前面的字符串
reverse(ch,i,j-1);
i = j+1;
}else{
//逆置最后一个字符串
reverse(ch,i,j-1);
i = j;
}
}
String str = new String(ch);
System.out.println(str);
}
}