题解 | #参数解析#

参数解析

https://www.nowcoder.com/practice/668603dc307e4ef4bb07bcd0615ea677

Java实现:使用双指针去遍历字符串进行参数解析,同时使用List存储解析后的参数;
时间复杂度:O(N)
空间复杂度:O(N)
改进的思路:先在字符串结尾加上一个空格,这样就能在while循环里解析最后一个不带双引号的参数
代码如下:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        // 标记是否遇到引号
        boolean hasQuotation = false;
        // 遍历字符串的左右指针
        int l = 0, r = 0;
        // 存放分解后的参数字符串
        List<String> ans = new ArrayList<>();
        while (r < s.length()) {
            char ch = s.charAt(r);
            if (ch == ' ') {
                if (!hasQuotation) {
                    ans.add(s.substring(l, r));
                    // 更新左右指针
                    l = r = r + 1;
                } else {
                    r++;
                }
            } else if (ch == '"') {
                if (hasQuotation) {
                    // 前面已有双引号,现在找到一对了,输出
                    ans.add(s.substring(l + 1, r)); // l + 1解释:跳过左双引号
                    // 更新左右指针
                    l = r = r + 2; // r + 2解释:跳过空格
                } else {
                    r++;
                }
                hasQuotation = !hasQuotation;
            } else {
                r++;
            }
        }
        // 处理最后一个参数(结尾字符非双引号才需处理,会被前面的while循环跳过)
        // 因为如果字符串的最后一个字符是双引号,则已经在前面的while循环处理了
        if (s.charAt(s.length() - 1) != '"') {
            ans.add(s.substring(l, r));
        }
        System.out.println(ans.size());
        for (String param : ans) {
            System.out.println(param);
        }
    }
}


#华为机试##笔试刷题#
全部评论

相关推荐

11-05 07:29
贵州大学 Java
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务