解题思路一:首先我们要输出参数个数,由于字符串当中的空格总是比参数个数少1(除双引号当中的空格),因此可以转化为计空格个数,定义count用来计空格数。
注意题目中要求双引号中的字符串不考虑空格数,在遇到第一个双引号时,需要一直遍历字符,直到遇到第二个双引号。遍历双引号以外的空格就要count++。
然后我们需要输出以空格分隔的各个字符串,这时我们会想如何输出双引号当中的字符串呢?我们可以定义一个状态flag,初始状态为1,当遇到第一个双引号时,flag^1,变为0,在flag为0时,说明我们在遍历双引号当中的字符串。
当字符不为空格且不为双引号时,输出字符。双引号的空格需要输出,双引号以外的空格需要换行
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
int count = 0;//用来记空格数
for(int i = 0;i < s.length();i++){
//遇到双引号时,要一直遍历,直到遇到第二个双引号
if(s.charAt(i) == '"'){
do{
i++;
}while(s.charAt(i) != '"');
}
//碰到双引号以外的空格要count++
if(s.charAt(i) == ' '){
count++;
}
}
//空格数比字符串个数少1
System.out.println(count+1);
int flag = 1;
for(int i = 0;i < s.length();i++){
//当碰到第一个双引号flag变为0,当碰到第二个双引号flag变为1
//说明在flag==0的时候。我们在遍历双引号的参数
if(s.charAt(i) == '"'){
flag ^= 1;
}
//除了双引号当中的空格和引号,其它字符都输出
if(s.charAt(i) != ' ' && s.charAt(i) != '"'){
System.out.print(s.charAt(i));
}
//双引号里的空格需要输出
if(s.charAt(i) == ' ' && flag == 0){
System.out.print(s.charAt(i));
}
//碰到双引号以外的空格需要换行
if(s.charAt(i) == ' ' && flag == 1){
System.out.println();
}
}
}
}
解题思路二:对字符串进行遍历,如果遇到\",则将flag置为true,如果遇到\"以外的空格,那么将它添加到链表中,其余情况,将字符添加到StringBuilder中
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
StringBuilder ret = new StringBuilder();
ArrayList<String> t = new ArrayList();
boolean flag = false;
for(int i = 0;i < str.length();i++){
char c = str.charAt(i);
//String.valueOf(c)-返回char参数的字符串char形式
//将String.valueOf(c)与"进行比较
//如何相等则为flase,不为"则是true
if(String.valueOf(c).equals("\"")){
flag = flag ? false : true;
continue;
}
//如果字符为空格且不是",那么将char类型转换为string类型后的值添加到链表t中
if(String.valueOf(c).equals(" ") && !flag){
//toString()返回表示此顺序中的数据的字符串。
t.add(ret.toString());
//对ret进行拷贝
ret = new StringBuilder();
}else{
ret.append(c);
}
}
t.add(ret.toString());
System.out.println(t.size());
for(String s:t){
System.out.println(s);
}
}
}