对于一个长度为 n 字符串,我们需要对它做一些变形。
首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。
比如"Hello World"变形后就变成了"wORLD hELLO"。
数据范围:
, 字符串中包括大写英文字母、小写英文字母、空格。
进阶:空间复杂度
, 时间复杂度
给定一个字符串s以及它的长度n(1 ≤ n ≤ 10^6)
请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。
"This is a sample",16
"SAMPLE A IS tHIS"
"nowcoder",8
"NOWCODER"
"iOS",3
"Ios"
import java.util.*;
public class Solution {
/**
* 将字符串中由空格分隔的单词顺序反转,同时将每个字母的大小写翻转。
* 要求:保留原字符串中所有空格的数量和相对位置(从右向左镜像保留)。
*
* @param s string字符串(只包含大小写字母和空格)
* @param n int整型(字符串长度,即 s.length())
* @return string字符串(处理后的结果)
*/
public String trans(String s, int n) {
// 从字符串末尾开始向前扫描
int i = n - 1;
StringBuilder res = new StringBuilder();
// 主循环:从右往左处理整个字符串
while (i >= 0) {
// 阶段1:遇到空格,直接追加到结果中(保留空格)
while (i >= 0 && s.charAt(i) == ' ') {
res.append(' '); // 保留每一个空格
i--; // 指针左移
}
// 如果已经处理完所有字符,提前退出
if (i < 0) break;
// 阶段2:遇到非空格字符,说明找到了一个单词的结尾
int end = i; // 记录当前单词的结束位置
// 继续向左移动,直到遇到空格或字符串开头,找到单词的起始位置
while (i >= 0 && s.charAt(i) != ' ') {
i--;
}
int start = i + 1; // 单词的实际起始索引
// 阶段3:将 [start, end] 范围内的单词按原顺序输出
// 同时翻转每个字母的大小写
for (int j = start; j <= end; j++) {
char c = s.charAt(j);
if (c >= 'A' && c <= 'Z') {
// 大写字母转小写
res.append((char)(c - 'A' + 'a'));
} else {
// 小写字母转大写
res.append((char)(c - 'a' + 'A'));
}
}
}
// 返回最终结果
return res.toString();
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param n int整型
* @return string字符串
*/
public String trans (String s, int n) {
// write code here
// 转换为数组
char[] ch = s.toCharArray();
// 转换大小写
for (int i = 0; i < n; i++) {
if ('a' <= ch[i] && ch[i] <= 'z') {
ch[i] = (char) (ch[i] - 'a' + 'A');
} else if ('A' <= ch[i] && ch[i] <= 'Z') {
ch[i] = (char)(ch[i] - 'A' + 'a');
}
}
//System.out.println(ch.toString());
// 整体进行反转
reverse(ch, 0, n-1);
// 每个单词进行反转
for (int i = 0; i < n; i++) {
int j = i;
while (j < n && ch[j] != ' ') {
j++;
}
reverse(ch, i, j-1);
i = j;
}
return new String(ch);
}
private void reverse(char[] ch, int left, int right) {
while (left < right) {
char tmp = ch[left];
ch[left] = ch[right];
ch[right] = tmp;
left++;
right--;
}
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param n int整型
* @return string字符串
*/
public String trans (String s, int n) {
// write code here
// 1.先大小写反转
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (chars[i] >= 'a' && chars[i] <= 'z') {
// 转大写
chars[i] = (char) ('A' + (chars[i] - 'a'));
} else if (chars[i] >= 'A' && chars[i] <= 'Z') {
// 转小写
chars[i] = (char) ('a' + (chars[i] - 'A'));
}
}
String convert = new String(chars);
// 2.再整体反转
// 字符串的拼接(add)、反转(reverse)、按索引替换(replace),推荐使用StringBuilder。
StringBuilder reverse = new StringBuilder(convert);
reverse.reverse();
// 3.最后局部反转
for (int i = 0; i < reverse.length(); i++) {
if (reverse.charAt(i) != ' ') {
// 当前字符非空格
int j = i + 1;
while (j < reverse.length() && reverse.charAt(j) != ' ') {
// 若j未出界且j非空格,则不断往后移动j
j++;
}
// 此时j移动到空格或j已经出界,可作为String类的subString方法和StringBuilder的replace方法的第二个索引参数
StringBuilder sub = new StringBuilder(reverse.substring(i, j));
reverse.replace(i, j, sub.reverse().toString());
// 将j赋给i,检测下一个非空格区间
i = j;
}
}
return reverse.toString();
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param n int整型
* @return string字符串
*/
public String trans (String s, int n) {
// write code here
char[] array = s.toCharArray();
reverse(array, 0, n - 1);
int start = 0;
for (int i = 0; i < n; i++) {
if (array[i] != ' ' && (i == 0 || array[i - 1] == ' ')) {
start = i;
}
if (array[i] != ' ' && (i == n - 1 || array[i + 1] == ' ')) {
reverse(array, start, i);
}
}
for (int i = 0; i < n; i++) {
if(array[i] >= 'a' && array[i] <= 'z'){
array[i] += 'A' - 'a';
}else if(array[i] >= 'A' && array[i] <= 'Z'){
array[i] += 'a' - 'A';
}else{
continue;
}
}
return new String(array);
}
public void reverse(char[] array, int l, int r) {
while (l < r) {
char temp = array[l];
array[l] = array[r];
array[r] = temp;
l++;
r--;
}
}
} public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param n int整型
* @return string字符串
*/
public static String trans (String s, int n) {
// write code here
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
if (Character.isUpperCase(c)) {
sb.append(Character.toLowerCase(c));
} else if (Character.isLowerCase(c)) {
sb.append(Character.toUpperCase(c));
} else {
sb.append(c);
}
}
String re = sb.toString();
String[] words = re.split("\\s+");
int i = 0;
int j = words.length - 1;
while (i < j) {
String st = words[i];
words[i] = words[j];
words[j] = st;
i++;
j--;
}
String result = "";
for ( int k = 0; k < words.length; k++) {
result += words[k];
if (k != words.length - 1) {
result += " ";
}
}
return result.toString();
}
} public String trans (String s, int n) {
// write code here
String result = "";
StringBuffer sbf = new StringBuffer();
for (int i = n - 1; i >= 0; i--) {
char c = s.charAt(i);
if (c == ' ') {
sbf.append(result + " ");
result = "";
continue;
} else {
result = Character.isUpperCase(c) ? Character.toLowerCase(
c) + result : Character.toUpperCase(c) + result;
}
}
sbf.append(result);
return sbf.toString();
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param n int整型
* @return string字符串
*/
public String trans (String s, int n) {
// write code here
String[] s1 = s.split(" ");
if(s1.length == 0)
return s;
StringBuilder s0 = new StringBuilder();
if(s.charAt(n - 1) == ' '){
s0.append(" ");
}
for (int i = s1.length - 1; i >= 0; i--){
String s2 = s1[i];
for(int j = 0; j < s2.length(); j++){
char c = s2.charAt(j);
c = Character.isUpperCase(c) ? Character.toLowerCase(c) : Character.toUpperCase(c);
s0.append(c);
}
if(i >= 1){
s0.append(" ");
}
}
return s0.toString();
}
} public String trans (String s, int n) {
String str = "";
String res = "";
for (int i = 0; i < n; i++) {
if (s.charAt(i) == ' ' && str.length() != 0) {
res = str + res;
res = " " + res;
str = "";
continue;
}else if (s.charAt(i) == ' ' && str.length() == 0){
res = " " + res;
}
else {
int t = s.charAt(i) - 'a';
//System.out.println(t);
if (t >= 0 && t <= 26) {
str += (char)(65 + t);
}else{
str += (char)(97 + (s.charAt(i) - 'A'));
}
}
}
res = str + res;
return res;
}
import java.lang.String;
public class Solution {
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * *
@param s string字符串
@param n int整型
@return string字符串
*/
public String trans (String s, int n) {
String r = " ";
char[] a = s.toCharArray();
for (int i = 0; i s.length(); i++) {
if (a[i] >= 'a' && a[i] 'z') {
a[i] -= 32;
} else if (a[i] >= 'A' && a[i] 'Z') {
a[i] += 32;
}
}
String t = new String(a);
String[] words = t.split(" ");
String[] w = new String[words.length];
StringBuffer sb = new StringBuffer();
for (int j = 0; j words.length; j++) {
w[j] = words[words.length - 1 - j];
}
if (a[s.length() - 1] == ' ') {
for (int z = 0; z words.length; z++) {
sb.append(" ").append(w[z]);
r = new String(sb);
}
} else {
r = String.join(" ", w);
}
return r; }
}
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param n int整型
* @return string字符串
*/
public String trans (String s, int n) {
// write code here
StringBuffer res =new StringBuffer();
String tmpStr = "";
for(int i =0;i<n;i++){
char c = s.charAt(i);
if(c>='a' && c<='z'){
tmpStr+=Character.toUpperCase(c);
}else if(c>='A' && c<='Z'){
tmpStr += Character.toLowerCase(c);
}else{
tmpStr = c+tmpStr;//c为空格的情况
res.insert(0,tmpStr);
tmpStr ="";
}
}
res.insert(0,tmpStr);
return res.toString();
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param n int整型
* @return string字符串
*/
public void reverse(char[] ch,int i,int j){
while(i < j){
char tmp = ch[i];
ch[i] = ch[j];
ch[j] = tmp;
i++;
j--;
}
}
public String trans (String s, int n) {
// write code here
char[] ch = s.toCharArray();
reverse(ch,0,n - 1);
int i = 0;
while(i < n){
int j = i;
while(j < n && ch[j] != ' '){
j++;
}
if(j < n){
reverse(ch,i,j - 1);
i = j + 1;
}else{
reverse(ch,i,j - 1);
i = j;
}
}
for(int j = 0;j < n;j++){
if(ch[j] >= 'a' && ch[j] <= 'z'){
ch[j] -= 32;
}else if(ch[j] >= 'A' && ch[j] <= 'Z'){
ch[j] += 32;
}
}
return new String(ch);
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param n int整型
* @return string字符串
*/
public static String trans (String s, int n) {
// write code here
StringBuilder temp = new StringBuilder();
for (int i = 0; i < n; i++) {
if (s.charAt(i) == ' ') {
//使用 # 将空格隔出来,如 " Ab cD" --> "# #aB# #Cd"
temp.append('#').append(solve(s.charAt(i))).append('#');
} else {
temp.append(solve(s.charAt(i)));
}
}
//直接根据 # 进行分割,得到[" ", "aB", " ", "Cd"]
//之后只需要从后往前读即可得到 "Cd aB "
String[] strs = temp.toString().split("#");
StringBuilder res = new StringBuilder();
for (int i = strs.length - 1; i >= 0 ; i--) {
res.append(strs[i]);
}
return res.toString();
}
public static char solve(char c) {
if (c == ' ') return c;
if (c >= 'a' && c <= 'z') {
return (char) (c - 32);
} else {
return (char) (c + 32);
}
}
} public String trans (String s, int n) {
// 大写变小写,空格不变化
// 先总反转,再分别反转
if(n==0) return s;
//实现大小写转换
StringBuilder sb=new StringBuilder();
for(int i=0;i<n;i++){
if(Character.isUpperCase((s.charAt(i)))){
sb.append(Character.toLowerCase(s.charAt(i)));
}else if(Character.isLowerCase((s.charAt(i)))){
sb.append(Character.toUpperCase(s.charAt(i)));
}else{
sb.append(s.charAt(i));//空格
}
}
//反转字符串
sb=sb.reverse();//反转第一次
for(int i=0;i<n;i++){
int j=i;
//以空格为表示,二次反转
while(j<n&&sb.charAt(j)!=' '){
j++;
}
//走到空格
//把左边裁剪下来
String tmp=sb.substring(i,j);//裁的是sb(变完大小写之后的)
StringBuilder bu=new StringBuilder(tmp);
tmp=bu.reverse().toString();//左半截反转
sb.replace(i,j,tmp);//把反转以后的替换掉
i=j;//更新j指针,j用于截取
}
return sb.toString();
} /**
* 思路:
* 先将字符串大小写转换
* 在讲字符串由空字符分开,关键是分开是要带上空白字符
* 倒序遍历字符串数组,拼接到一个新的字符串
*
* @param s string字符串
* @param n int整型
* @return string字符串
*/
public String trans (String s, int n) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c <= 'Z' && c >= 'A'){
sb.append((char)(c - 'A' + 'a'));
}else if (c <= 'z' && c >= 'a'){
sb.append((char)(c - 'a' + 'A'));
}else {
sb.append(" ");
}
}
String s1 = String.valueOf(sb);
String[] str = s1.split(" ",-1);//关键
StringBuilder strbuild = new StringBuilder();
for (int i = str.length - 1; i >= 0 ; i--) {
if (i == 0){
strbuild.append(str[i]);
}else {
strbuild.append(str[i]).append(" ");
}
}
return strbuild.toString();
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param n int整型
* @return string字符串
*/
public String trans (String s, int n) {
// write code here
StringBuilder sb = new StringBuilder();
boolean isSpace = false;
StringBuilder strB = new StringBuilder();
List<String> strs = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (!isSpace && c == ' ') {
isSpace = true;
strs.add(strB.toString());
strs.add(" ");
strB = new StringBuilder();
continue;
}
if (c != ' ') {
if (isSpace) {
strs.add(strB.toString());
strB = new StringBuilder();
}
isSpace = false;
}
strB.append(c);
if (i == s.length() - 1) {
strs.add(strB.toString());
}
}
for (int i = strs.size() - 1; i >= 0; i--) {
String str = strs.get(i);
if (str.isEmpty()) {
sb.append(str);
continue;
}
char[] chars = str.toCharArray();
for (char c : chars) {
if (isSmall(c)) {
sb.append(String.valueOf(c).toUpperCase());
} else {
sb.append(String.valueOf(c).toLowerCase());
}
}
}
return sb.toString();
}
public boolean isSmall(char c) {
return c >= 'a' && c <= 'z';
}
}