今天也水一篇题解吧

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;
    }
}
题目描述似乎缺失了关键信息,通常我会需要了解“P10780 食物”是什么具体的算法竞赛题目,它来自在线平台洛谷(Luogu),以及该题目的大致背景、条件和目标。洛谷食物(Food)可能是某种数据结构或算法问题,比如贪吃蛇、分配任务等。 然而,我可以给你提供一个通用的模板: **[洛谷 P10780 食物 - 题目解析]** 题目名称:P10780 食物(假设是关于食物分配或者饥饿游戏的问题) 链接:[插入实际题目链接] **背景:** 此题通常涉及动态规划或者搜索策略。场景可能是有n个参与者(选手或角色),每个都有特定的食物需求或者优先级,我们需要在有限的食物资源下合理分配。 **分析:** 1. **输入理解**:首先读入n个参与者的信息,包括每个人的需求量或优先级。 2. **状态定义**:可以定义dp[i][j]表示前i个人分配完成后剩余的食物能满足第j个人的最大程度。 3. **状态转移**:递推式可能涉及到选择当前人分配最多食物的版本,然后更新剩余的食物数。 4. **边界条件**:如果剩余食物不足以满足某人的需求,则考虑无法分配给他;如果没有食物,状态值设为0。 5. **优化策略**:可能需要对状态数组进行滚动更新,以减少空间复杂度。 **代码示例(伪代码或部分关键代码片段):** ```python # 假设函数分配_food(demand, remaining)计算分配给一个人后剩余的食物 def solve(foods): dp = [[0 for _ in range(max_demand + 1)] for _ in range(n)] dp = foods[:] # 从第一个到最后一个参与者处理 for i in range(1, n): for j in range(1, max_demand + 1): if dp[i-1][j] > 0: dp[i][j] = max(dp[i][j], dp[i-1][j] - foods[i]) dp[i][j] = max(dp[i][j], distribute_food_to(i, dp[i-1][j])) return dp[n-1][max_demand] ``` **相关问题--:** 1. 这道题是如何运用动态规划的? 2. 如果有优先级限制,应该如何调整代码? 3. 怎样设计搜索策略来解决类似问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值