首页 > 试题广场 >

字符串变形

[编程题]字符串变形
  • 热度指数:176225 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
对于一个长度为 n 字符串,我们需要对它做一些变形。

首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。

比如"Hello World"变形后就变成了"wORLD hELLO"。

数据范围: , 字符串中包括大写英文字母、小写英文字母、空格。
进阶:空间复杂度 , 时间复杂度

输入描述:
给定一个字符串s以及它的长度n(1 ≤ n ≤ 10^6)


输出描述:
请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。
示例1

输入

"This is a sample",16

输出

"SAMPLE A IS tHIS"
示例2

输入

"nowcoder",8

输出

"NOWCODER"
示例3

输入

"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();
    }
}


发表于 2025-12-24 16:35:34 回复(0)
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--;
        }
    }
}

发表于 2025-08-04 21:56:21 回复(0)
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();
    }
}

发表于 2024-11-17 15:18:10 回复(1)
为什么报错啊?报错并提交时这个用例测试不通过,这种用例输入是怎样输入却不报错的???看得这个用例输入不合理

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @param n int整型
     * @return string字符串
     */
    public String trans (String s, int n) {
        // write code here
        if(n==0)
            return s;
        if(s == null || s.isEmpty()){
            return s;
        }
        int start = 0;
        while(start < s.length() && Character.isWhitespace(s.charAt(start))){
            start++;
        }
        System.out.println("start = " + start);
        int end = s.length()-1;
        while(end >= 0 && Character.isWhitespace(s.charAt(end))){
            end--;
        }
        String trimS = s.trim();
        StringBuilder sb = new StringBuilder(n);
        String[] str = trimS.split(" ");
        for(int i=str.length-1;i>=0;i--){
            if(sb != null && sb.length() > 0){
                sb.append(" ");
            }
            for(char c : str[i].toCharArray()){
                if(Character.isUpperCase(c)){
                    sb.append(Character.toLowerCase(c));
                }else if(Character.isLowerCase(c)){
                    sb.append(Character.toUpperCase(c));
                }else{
                    sb.append(c);
                }
            }
        }
        if(sb.length() != s.length()){
            for(int i=0;i<(s.length()-(end+1));i++) {
                sb.insert(0, " ");
            }
            for(int j=0;j<start;j++){
                sb.append(" ");
            }
        }
        return sb.toString();
    }
}
发表于 2024-10-15 12:05:06 回复(2)
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--;
        }
    }
}

发表于 2024-09-24 12:52:31 回复(0)
public String trans (String s, int n) {
        // write code here
          if(n==0)
            return s;
        String res="";
        String t = "";
        for (int i = 0; i<n;i++) {
            char c = s.charAt(i);
            if (c >= 'A' && c <= 'Z') {
                t = t+(char)(c - 'A' + 'a');
            }else if (c >= 'a' && c <= 'z'){
                t = t+(char)(c - 'a' + 'A');
            }else{
                res = c+ t + res ;
             
                t="";
            }

        }

        res = t + res ;

        return res;
    }


为啥会超时
发表于 2024-08-27 13:41:45 回复(0)
简单上手
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();
    }
}

发表于 2024-06-25 13:05:49 回复(0)
  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();
    }

发表于 2024-06-18 11:59:47 回复(0)
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();
    }
}

发表于 2024-05-31 18:24:24 回复(0)
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;
    }


该代码由于使用了 类似 c = a + c的形式,比a += c 效率慢,空间占用也多。评论区有人做了解释。

1. str=str+a;会先将等号右边的两个string对象内容相加,得到一个新的string对象,再把这个新的对象赋给等号左边的string对象。
2. str+=a;直接将等号右边的string对象内容追加到左边的string对象后面。
3. +相比于+=在这个过程中会多产生一个新对象,创建新对象,不仅要时间,新的对象还要占内存,所以+=效率较高。
编辑于 2024-04-12 14:52:01 回复(0)
这个代码那里错了,最后一组用例报了错
import java.util.*;

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;

    }

}

发表于 2023-12-10 03:32:40 回复(1)
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();
        
    }
}

发表于 2023-10-30 15:23:32 回复(0)
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);
    }
}

发表于 2023-09-18 09:48:13 回复(0)
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);
        }
    }
}

发表于 2023-09-05 22:45:22 回复(0)
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();
    }

发表于 2023-08-01 10:46:51 回复(0)
 /**
     * 思路:
     * 先将字符串大小写转换
     * 在讲字符串由空字符分开,关键是分开是要带上空白字符
     * 倒序遍历字符串数组,拼接到一个新的字符串
     * 
     * @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();
    }

发表于 2023-07-30 12:39:43 回复(0)
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';
    }

}

发表于 2023-07-10 11:28:00 回复(0)

问题信息

难度:
76条回答 22830浏览

热门推荐

通过挑战的用户

查看代码
字符串变形