华为机试-HJ13 句子逆序

90 阅读1分钟

题目

image.png

www.nowcoder.com/practice/[4…](www.nowcoder.com/practice/48…)

我的题解

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args)throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while ((str = bf.readLine()) != null) {
            String[] arr = str.split("\\s+");
            StringBuilder sb = new StringBuilder();
            for (int i = arr.length - 1; i >= 0; i--) {
                sb.append(arr[i]).append(" ");
            }
            System.out.println(sb.substring(0, sb.length() - 1));
        }
    }
}

image.png

思路:

1、String[] arr = str.split("\\s+"); 拆分为数组倒叙输出

2、System.out.println(sb.substring(0, sb.length() - 1)); 去除最后一个空格

参考题解

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args)throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while ((str = bf.readLine()) != null) {
            String[] arr = str.split("\\s+");
            StringBuilder sb = new StringBuilder();
            for (int i = arr.length - 1; i >= 0; i--) {
                sb.append(" ").append(arr[i]);
            }
            sb.deleteCharAt(0);
            System.out.println(sb.toString());
        }
    }
}

image.png

总结:

1、三种方式拼接字符串并去掉最后的连接符小尾巴

            StringBuilder sb = new StringBuilder();
            for (int i = arr.length - 1; i >= 0; i--) {
                sb.append(arr[i]).append(" ");
            }
            System.out.println(sb.substring(0, sb.length() - 1));
            
            StringBuilder sb = new StringBuilder();
            for (int i = arr.length - 1; i >= 0; i--) {
                sb.append(" ").append(arr[i]);
            }
            sb.deleteCharAt(0);
            System.out.println(sb.toString());
            
            StringBuilder sb = new StringBuilder();
            for (int i = arr.length - 1; i >= 0; i--) {
                sb.append(arr[i]).append(" ");
            }
            sb.deleteCharAt(sb.length()-1);
            System.out.println(sb);

高效题解

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while ((str = br.readLine()) != null) {
            StringBuilder sb = new StringBuilder();
            char[] chars = (str + " ").toCharArray();
            int len = str.length();
            // 碰到空格就将当前
            int first = 0;
            int last = len;
            char[] newchar = new char[len];
            for (int j = 0; j <= str.length(); j++) {
                char c = chars[j];
                if (c == ' ') {
                    // 需要copy的长度
                    int _len = j - first;
                    // 开始位置
                    int despos = last - _len;
                    System.arraycopy(chars, first, newchar, despos, _len);
                    // 从旧的下一个位置开始copy,需要赋值空,所以多移动一位
                    first = j + 1;
                    len = len - _len - 1;
                    last = len;
                    // copy完成后,指针变动后,赋值空
                    if (last > 0) {
                        newchar[last] = ' ';
                    }
                }
            }
            System.out.println(new String(newchar));
        }
    }
}

image.png

总结:

1、和上面的相比就快几ms、太复杂工作用的很少、不研究