首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >java场景思维题

java场景思维题

原创
作者头像
RookieCyliner
发布2025-07-15 23:25:32
发布2025-07-15 23:25:32
2010
举报
文章被收录于专栏:javajava

1、在LeetCode上,题目139:

单词拆分 要求我们判断一个字符串是否可以被空格拆分成一个或多个在字典中出现的单词。这是一个典型的动态规划问题。

我们可以使用一个数组 dp 来记录从字符串开始到当前位置是否可以被拆分成一个或多个字典中的单词。dp[i] 表示字符串的前 i 个字符是否可以被拆分成字典中的单词。

解题思路

  1. 创建一个布尔型数组 dp,长度为 n+1,其中 n 是字符串的长度。dp[i] 表示字符串的前 i 个字符是否可以被拆分成字典中的单词。
  2. 初始化 dp[0]true,因为空字符串总是可以被拆分的。
  3. 遍历字符串的每个字符,对于每个位置 i
    • 再次遍历从位置 0i 的所有位置 j
    • 如果 dp[j]true(意味着前 j 个字符可以被拆分),并且从 j+1i 的子字符串存在于字典中,那么设置 dp[i] = true

4.最后,返回 dp[n],即整个字符串是否可以被拆分成字典中的单词。

代码语言:txt
复制
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
public class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        Set<String> wordSet = new HashSet<>(wordDict); // 将字典转换为HashSet以便快速查找
        int n = s.length();
        boolean[] dp = new boolean[n + 1]; // dp数组,长度为n+1,初始化为false
        dp[0] = true; // 空字符串总是可以被拆分的
 
        for (int i = 1; i <= n; i++) { // 从1开始,因为已经初始化了dp[0]
            for (int j = 0; j < i; j++) { // 尝试所有可能的拆分点
                if (dp[j] && wordSet.contains(s.substring(j, i))) { // 如果前缀可以拆分,并且当前子串在字典中
                    dp[i] = true; // 则当前位置也可以被拆分
                    break; // 找到一个有效的拆分方式,可以提前结束内层循环
                }
            }
        }
 
        return dp[n]; // 返回整个字符串是否可以被拆分
    }
}

复杂度分析

  • 时间复杂度:O(n^2),其中 n 是字符串的长度。外层循环遍历字符串的每个位置,内层循环尝试所有可能的拆分点。尽管看起来像是 O(n^3)(因为有子字符串的操作),但由于子字符串的比较是在常数时间内完成的(使用了HashSet),所以实际复杂度仍然是 O(n^2)。
  • 空间复杂度:O(n),用于存储 dp 数组。

2、全链路压测中,某一个服务器CPU负载率100%,磁盘和内存使用率正常,分析可能的原因

初步判断问题性质

由于只有CPU饱和,可以判断:

  • 不是内存泄漏
  • 不是磁盘io阻塞
  • CPU密集型任务导致

这说明:

  • 要么某些请求中包含了计算密集型代码逻辑
  • 要么有死循环、死锁等逻辑问题
  • 或者有异常请求导致某个线程池被占满

二、定位具体高 CPU 原因

可采用以下步骤(可以在面试时按这个顺序答):

1. top/htop/ps 查看哪个进程/线程占用 CPU 高

  • top 查找是哪个进程(比如 nginx/java/python)
  • top -H -p <PID> 查找是哪个线程占用高(线程 ID)
  • ps -eLo pid,tid,pcpu,args --sort=-pcpu | head 查看线程明细

如果是 Java 程序,可以记录线程ID,转换为十六进制再到 jstack 中排查。

2. jstack / perf / flame graph 分析具体代码

对于 Java 应用:

  • jstack <PID> 分析线程堆栈
  • 查看哪个线程在运行什么逻辑
  • 是否存在死循环、热点锁、过度计算等
  • 使用 perf top, perf record + perf report(Linux)找热点函数
  • 用火焰图(Flame Graph)展示 CPU 占用在哪些方法上

3. 查看接口调用日志 / 链路追踪

  • 是否存在某些请求突然变得慢或数量异常高?
  • 分析日志,是否有高频率请求某些 API?
  • 检查是否有业务代码计算密集(如复杂加解密、数据压缩、json 处理、正则解析等)

4. 结合压测场景回看流量特征

  • 这台机器是否被错误地负载过重?(LB 权重不均)
  • 是否是压测数据重复、造成缓存失效导致落到计算?
  • 某些特定路径是否流量异常(如重试逻辑失控)

三、具体可能的原因分析

常见导致 CPU 100% 的场景

1. 死循环或递归未终止

2. 代码中有大量 JSON/XML 解析、数据加密解密等 CPU 密集操作

3. 热 Key 问题 / 锁竞争严重

4. 无效请求/错误参数导致计算逻辑异常

5. 线程池配置错误,过多线程切换(上下文切换高)

6. 日志打印过多,尤其在控制台打印

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、在LeetCode上,题目139:
    • 解题思路
    • 复杂度分析
  • 2、全链路压测中,某一个服务器CPU负载率100%,磁盘和内存使用率正常,分析可能的原因
    • 初步判断问题性质
    • 二、定位具体高 CPU 原因
    • 三、具体可能的原因分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档