【华为OJ】【048-参数解析】

【华为OJ】【算法总篇章】


【华为OJ】【048-参数解析】

【工程下载】


题目描述

在命令行输入如下命令: xcopy /s c:\ d:\, 各个参数如下:
参数1:命令字xcopy
参数2:字符串/s
参数3:字符串c:参数4: 字符串d:请编写一个参数解析程序,实现将命令行各个参数解析出来。

解析规则:
1.参数分隔符为空格
2.对于用“”包含起来的参数,如果中间有空格,不能解析为多个参数。
  比如在命令行输入xcopy /s “C:\program files” “d:\”时,参数仍然是4个,
  第3个参数应该是字符串C:\program files,而不是C:\program,注意输出参数时,需要将“”去掉,引号不存在嵌套情况。
3.参数不定长
4.输入由用例保证,不会出现不符合要求的输入

输入描述

输入一行字符串,可以有空格

输出描述

输出参数个数,分解后的参数,每个参数都独占一行

输入例子

xcopy /s c:\\\ d:\\

输出例子

4
xcopy
/s
c:\\d:\\

算法实现

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Author: 王俊超
 * Date: 2015-12-25 08:31
 * Declaration: All Rights Reserved !!!
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {
            String input = scanner.nextLine();
            System.out.println(argAnalysis(input));
        }

        scanner.close();
    }

    /**
     * 分析参数,【还有另外一种方法,就是直接利用数组来处理,可减少时间复杂度和空间复杂度,处理起来会麻烦一些】
     * @param s
     * @return
     */
    private static String argAnalysis(String s) {

        List<String> list = new ArrayList<>();

        // 表示最后一个"出现的下一个位置,如果没有"就为0
        int prev = 0;
        for (int i = 0; i < s.length(); ) {
            // i开始的第一个双引号
            if (s.charAt(i) == ‘"‘) {
                // 添加不包双引号的字符串
                list.add(s.substring(prev, i));

                for (int j = i + 1; j < s.length(); j++) {
                    // 开始的第二个双引号
                    if (s.charAt(j) == ‘"‘) {
                        list.add(s.substring(i, j + 1));

                        i = j + 1;
                        prev = i;
                    }
                }
            } else {
                i++;
            }
        }

        // 【1】
//        // 表示没有"
//        if (prev == 0) {
//            list.add(s);
//        }
//        // 还有最后一个没有
//        else if (prev < s.length()) {
//            list.add(s.substring(prev, s.length()));
//        }

        // 【2】,【1】【2】实现同样的效果
        if (prev < s.length()) {
            list.add(s.substring(prev, s.length()));
        }

        // 下面处理空格,双引号引起的字符串不作处理
        int result = 0;
        StringBuilder builder = new StringBuilder();
        for (String t : list) {
            // 如果不以"开始
            if (!t.startsWith("\"")) {
                String[] sts = t.split("\\s+");
                result += sts.length;
                for (String st : sts) {
                    builder.append(st).append(‘\n‘);
                }
            } else {
                result++;
                builder.append(t).append(‘\n‘);
            }
        }

        return result + "\n" + builder.substring(0, builder.length() - 1);
    }
}
时间: 2024-10-13 15:15:47

【华为OJ】【048-参数解析】的相关文章

【华为OJ】【044-超长正整数相加】

[华为OJ][算法总篇章] [华为OJ][044-超长正整数相加] [工程下载] 题目描述 请设计一个算法完成两个超长正整数的加法. 接口说明 /** * 请设计一个算法完成两个超长正整数的加法. * 输入参数: * String addend:加数 * String augend:被加数 * 返回值:加法结果 */ public String addLongInteger(String addend, String augend) { /*在这里实现功能*/ return null; } 输入

【华为OJ】【094-多线程】

[华为OJ][算法总篇章] [华为OJ][094-多线程] [工程下载] 题目描述 问题描述:有4个线程和1个公共的字符数组.线程1的功能就是向数组输出A,线程2的功能就是向字符输出B, 线程3的功能就是向数组输出C,线程4的功能就是向数组输出D.要求按顺序向数组赋值ABCDABCDABCD, ABCD的个数由线程函数1的参数指定. 输入描述: 输入一个int整数 输出描述: 输出多个ABCD 输入例子: 10 输出例子: ABCDABCDABCDABCDABCDABCDABCDABCDABCD

【华为OJ】【075-判断两个IP是否属于同一子网】

[华为OJ][算法总篇章] [华为OJ][075-判断两个IP是否属于同一子网] [工程下载] 题目描述 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据. 子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为"1"和主机号部分全为"0".利用子网掩码可以判断 两台主机是否中同一子网中.若两台主机的IP地址分别与它们的子网掩码相"与"后的结果相同,则说明这两台主机在同一子网中. 示例: IP地址 192.168.0.

【华为OJ】【072-火车进站】

[华为OJ][算法总篇章] [华为OJ][072-火车进站] [工程下载] 题目描述 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车, 每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号 思路: 此处所谓字典序排序的意思是这n辆火车有多少种出站的可能顺序(也就是数据结构中的栈有多少种出栈顺序). 思路为用三个变量分别存储待进站火车,站中火车和已出站火车,其中待进站火车用Queue(队列)存储和站中 火车采用stack(栈)存储,已出站火车采用St

【华为OJ】【060-自守数】

[华为OJ][算法总篇章] [华为OJ][060-自守数] [工程下载] 题目描述 自守数是指一个数的平方的尾数等于该数自身的自然数.例如:252 = 625,762 = 5776,93762 = 87909376. 请求出n以内的自守数的个数 接口说明 /** * 功能: 求出n以内的自守数的个数 * * 输入参数:int n * 返回值:n以内自守数的数量. */ public static int calcAutomorphicNumbers(int n) { /*在这里实现功能*/ re

【华为OJ】【065-字符逆序】

[华为OJ][算法总篇章] [华为OJ][065-字符逆序] [工程下载] 题目描述 将一个字符串str的内容颠倒过来,并输出.str的长度不超过100个字符. 如:输入"I am a student",输出"tneduts a ma I". 输入参数: inputString:输入的字符串 返回值: 输出转换好的逆序字符串 输入描述 输入一个字符串,可以有空格 输出描述 输出逆序的字符串 输入例子 I am a student 输出例子 tneduts a ma

【华为OJ】【049-尼科彻斯定理】

[华为OJ][算法总篇章] [华为OJ][049-尼科彻斯定理] [工程下载] 题目描述 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和. 例如: 1^3=1 2^3=3+5 3^3=7+9+11 4^3=13+15+17+19 接口说明 原型: /* * 功能: 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和. * 原型: * int getSequeOddNum(int m); * 输入参数: * int m:整数(取值范围:1-100) * *

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返

百度URL参数解析

百度URL参数解析 在用Python爬取百度搜索的内容时,发现百度搜索的url非常的长,往往会跟一大段的参数,但其实很多参数都是没有必要的,如同样是搜索java关键字,可以通过 http://www.baidu.com/s?wd=java 如此简单的URL来获取,而下面这个超级复杂的URL也是同样进行了关键字java的搜索: http://www.baidu.com/s?wd=java&rsv_spt=1&rsv_iqid=0xd3c8c51900052eb3&issp=1&