通过万岁!!!
- 题目:给一个字符串,统计字符串中有多少个符合要求的单词。字符串包括小写字母、数字、连字符(’-’)、标点符号(’!’、’.’ 、 ‘,’)以及空格组成,但是单词符合三个条件
- 不能包含数字
- 最多一个连接符,并且连接符前后必须是字母
- 最多一个标点符号,并且应该在最后
- 思路:先分割字符串,然后遍历每个字符串,看看是不是满足条件
- 技巧:无
伪代码
分割字符串
定义统计单词数量的变量num=0
定义连接符统计变量link
遍历字符串数组,得到的我们称为虚假单词,因为不一定是符合要求的
如果虚假单词的长度是0就直接continue
link=0
for遍历虚假单词的每个字符,下标为j
如果字符是数字,直接break
如果字符是'-'
如果link==1,或者j等于0或则和j=虚假单词长度,这时候都要break,都是不满足条件的
否则link++
如果是表单符号,并且j不是最后一个,则直接break
如果j是最后一个字符了,则num++
最后返回num即可
java代码
class Solution {
public int countValidWords(String sentence) {
String[] tokens = sentence.split(" ");
int link;
int num = 0;
for (int i = 0; i < tokens.length; i++) {
if (tokens[i].length() == 0) continue;// 因为split会将两个空格也进行差分,但是拆分出来并没有东西,其实这一句不写也行
link = 0;
int length = tokens[i].length() - 1;
for (int j = 0; j <= length; j++) {
if (tokens[i].charAt(j) >= 48 && tokens[i].charAt(j) <= 57) break;// 数字
if (tokens[i].charAt(j) == '-') {
if (link == 1 || j == 0 || j == length) break;
if (!(tokens[i].charAt(j - 1) >= 97 && tokens[i].charAt(j - 1) <= 122 &&
tokens[i].charAt(j + 1) >= 97 && tokens[i].charAt(j + 1) <= 122)) break;
link++;
}
if ((tokens[i].charAt(j) == '!'
|| tokens[i].charAt(j) == '.'
|| tokens[i].charAt(j) == ',')
&& !(j == length)) break;
if (j == length)
num++;
}
}
return num;
}
}
- 总结:题目不难,就是遍历一下就可以了,然后注意逻辑条件的判断,不知道优先级,就不要省略括号。