今天也水一篇题解吧

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;
    }
}
上一篇:Illustrator绘制矢量风格简笔驯鹿头像


下一篇:最常用的图形接口:VNC