1 万人千题,跟着英雄哥有肉吃
https://blog.csdn.net/WhereIsHeroFrom/article/details/121260397
2 打卡第23讲
《算法零基础100讲》(第23讲) 字符串算法(三) - 字符串分割
https://blog.csdn.net/WhereIsHeroFrom/article/details/120875827
3 题目
3.1 58. 最后一个单词的长度
思路一:
用空格符分隔成数组,取最后一个值,计算长度。
有点慢。
class Solution {
public int lengthOfLastWord(String s) {
String[] words = s.split(" ");
return words[words.length-1].length();
}
}
思路二:
找到最后一个空格的索引下标,然后用总的长度减去它。
class Solution {
public int lengthOfLastWord(String s) {
// 防止最后一个字符是空格
s = s.trim();
return s.length() - s.lastIndexOf(" ") - 1;
}
}
3.2 434. 字符串中的单词数
思路一:
分隔字符,计算数组长度
有点慢
class Solution {
public int countSegments(String s) {
s = s.trim();
if (s.length() == 0) {
return 0;
}
// 正则匹配1到多个空格来分隔
return s.split("\\s+").length;
}
}
思路二:
遍历每个字符并计数
class Solution {
public int countSegments(String s) {
s = s.trim();
int count = 0;
int i = 0;
boolean flag = true;
while (i < s.length()) {
if (flag && s.charAt(i) != ' ') {
count++;
flag = false;
}
if (s.charAt(i) == ' ') {
flag = true;
}
i++;
}
return count;
}
}
3.3 2042. 检查句子中的数字是否递增
class Solution {
public boolean areNumbersAscending(String s) {
String[] words = s.split(" ");
int lastNum = -1;
for (int i = 0; i < words.length; i++) {
// 不是数字的话 就遍历下一个
if (words[i].charAt(0) > 65) {
continue;
}
// 判断上个数字是否大于当前数字
Integer num = Integer.valueOf(words[i]);
if (lastNum >= num) {
return false;
}
lastNum = num;
}
return true;
}
}
3.4 2047. 句子中的有效单词数
每个规则都校验的话,写起来代码好长,还是正则方便,可惜。。唉。。
class Solution {
public int countValidWords(String sentence) {
sentence = sentence.trim();
String[] tokens = sentence.split("\\s+");
if (tokens.length == 0) {
return 0;
}
int count = 0;
for (String token : tokens) {
// 1 校验是否有效字符
// 2 校验是否一个横线 位置是否正确 前后是否是有效字符
// 3 校验标点是否正确
if (islegalCharacter(token)
&& isOneDashAndPositionCorrect(token)
&& isOnePunctuation(token)) {
count++;
}
}
return count;
}
private boolean islegalCharacter(String token) {
int i = 0;
while (i < token.length()) {
char c = token.charAt(i);
// 仅由小写字母、连字符和/或标点(不含数字)
if (!isLetter(c) && c != '-' && c != '!' && c != '.' && c != ',') {
return false;
}
i++;
}
return true;
}
/**
* 至多一个 连字符 '-' 。如果存在,连字符两侧应当都存在小写字母("a-b" 是一个有效单词,但 "-ab" 和 "ab-" 不是有效单词)
*/
private boolean isOneDashAndPositionCorrect(String token) {
if (token.charAt(0) == '-' || token.charAt(token.length() - 1) == '-') {
return false;
}
int i = 1;
int count = 0;
while (i < token.length() - 1) {
if (count > 1) {
return false;
}
if (token.charAt(i) == '-') {
count++;
if (!(isLetter(token.charAt(i - 1)) && isLetter(token.charAt(i + 1)))) {
return false;
}
}
i++;
}
return count <= 1;
}
private boolean isLetter(char c) {
return c >= 'a' && c <= 'z';
}
/*
* 至多一个 标点符号。如果存在,标点符号应当位于 token 的 末尾 。
*/
private boolean isOnePunctuation(String token) {
int i = 0;
while (i < token.length() - 1) {
if (token.charAt(i) == ','
|| token.charAt(i) == '.'
|| token.charAt(i) == '!') {
return false;
}
i++;
}
return true;
}
3.5 1816. 截断句子
class Solution {
public String truncateSentence(String s, int k) {
String[] words = s.split(" ");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < k; i++) {
sb.append(words[i]);
if (i + 1 != k) {
sb.append(" ");
}
}
return sb.toString();
}
}
3.6 1784. 检查二进制字符串字段
格局小了,还是要多思考
class Solution {
public boolean checkOnesSegment(String s) {
return !s.contains("01");
}
}
3.7 468. 验证IP地址
太菜了,面向测试用例编程,逃~
class Solution {
public String validIPAddress(String queryIP) {
if (queryIP.contains(".")) {
if (isIpv4(queryIP)) {
return "IPv4";
} else {
return "Neither";
}
} else {
if (isIpv6(queryIP)) {
return "IPv6";
} else {
return "Neither";
}
}
}
private boolean isIpv4(String ip) {
String[] nums = ip.split("\\.");
if (nums.length != 4 || ip.charAt(ip.length() - 1) == '.') {
return false;
}
try {
for (int i = 0; i < nums.length; i++) {
if (nums[i].length() < 1 || (nums[i].charAt(0) == '0' && nums[i].length() > 1)) {
return false;
}
int num = Integer.valueOf(nums[i]);
if (num > 255 || num < 0) {
return false;
}
}
} catch (NumberFormatException e) {
return false;
}
return true;
}
private boolean isIpv6(String ip) {
String[] nums = ip.split(":");
if (nums.length != 8 || ip.charAt(ip.length() - 1) == ':') {
return false;
}
for (int i = 0; i < nums.length; i++) {
if (nums[i].length() > 4 || nums[i].length() < 1 || isNotLegalChar(nums[i])) {
return false;
}
}
return true;
}
private boolean isNotLegalChar(String nums) {
int i = 0;
while (i < nums.length()) {
if ((nums.charAt(i) >= '0' && nums.charAt(i) <= '9')
|| (nums.charAt(i) >= 'A' && nums.charAt(i) <= 'F')
|| (nums.charAt(i) >= 'a' && nums.charAt(i) <= 'f')) {
i++;
continue;
}
return true;
}
return false;
}
}