Middle-题目99:227. Basic Calculator II

本文介绍了一个简单的表达式计算器实现,该计算器能解析并计算包含+,-,*,/运算符及空格的表达式字符串,通过两次遍历字符串完成计算。
部署运行你感兴趣的模型镜像

题目原文:
Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid.
Some examples:
“3+2*2” = 7
” 3/2 ” = 1
” 3+5 / 2 ” = 5
题目大意:
计算一个表达式字符串的值,其中含有+,-,*,/,空格和数字
题目分析:
既然用JavaScript的eval水过去会错,那就认真算一下。
首先没有括号,不用考虑括号的问题。那么从左到右先乘除后加减即可。遍历字符串两遍。
源码:(language:java)

public class Solution {
    public int calculate(String s) {
        s=s.replace(" ","");
        String[] nums = s.split("[\\+\\-\\*\\/]");
        List<Integer> numberList = new ArrayList<>();
        for(String num : nums)
            numberList.add(Integer.parseInt(num));
        int index = 0;
        for (int i = 0; i<s.length(); i++) {
            char ch = s.charAt(i);
            if (ch == '+' || ch == '-') 
                index++;
            else if (ch == '*' || ch == '/') {
                int op1 = numberList.get(index);
                int op2 = numberList.get(index+1);
                numberList.remove(index);
                numberList.remove(index);
                numberList.add(index, operate(op1,ch,op2));
            }
        }

        int result = numberList.get(0); index = 1;
        for(int i = 0;i<s.length();i++) {
            char ch = s.charAt(i);
            if(ch == '+' || ch == '-') 
                result = operate(result, ch, numberList.get(index++));
        }
        return result;

    }
    private Integer operate(int a, char op, int b) {
        if(op=='+')
            return a+b;
        else if(op=='-')
            return a-b;
        else if(op=='*')
            return a*b;
        else 
            return a/b;
    }
}

成绩:
90ms,beats 13.83%,众数26ms,3.63%
Cmershen的碎碎念:
主要浪费时间还是在split上。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
内容概要:本文系统阐述了企业新闻发稿在生成式引擎优化(GEO)时代下的全渠道策略与效果评估体系,涵盖当前企业传播面临的预算、资源、内容与效果评估四大挑战,并深入分析2025年新闻发稿行业五大趋势,包括AI驱动的智能化转型、精准化传播、首发内容价值提升、内容资产化及数据可视化。文章重点解析央媒、地方官媒、综合门户和自媒体四类媒体资源的特性、传播优势与发稿策略,提出基于内容适配性、时间节奏、话题设计的策略制定方法,并构建涵盖品牌价值、销售转化与GEO优化的多维评估框架。此外,结合“传声港”工具实操指南,提供AI智能投放、效果监测、自媒体管理与舆情应对的全流程解决方案,并针对科技、消费、B2B、区域品牌四大行业推出定制化发稿方案。; 适合人群:企业市场/公关负责人、品牌传播管理者、数字营销从业者及中小企业决策者,具备一定媒体传播经验并希望提升发稿效率与ROI的专业人士。; 使用场景及目标:①制定科学的新闻发稿策略,实现从“流量思维”向“价值思维”转型;②构建央媒定调、门户扩散、自媒体互动的立体化传播矩阵;③利用AI工具实现精准投放与GEO优化,提升品牌在AI搜索中的权威性与可见性;④通过数据驱动评估体系量化品牌影响力与销售转化效果。; 阅读建议:建议结合文中提供的实操清单、案例分析与工具指南进行系统学习,重点关注媒体适配性策略与GEO评估指标,在实际发稿中分阶段试点“AI+全渠道”组合策略,并定期复盘优化,以实现品牌传播的长期复利效应。
行 3278: 11-02 14:48:13.375 1707 5019 D OplusStartingWindowManager: we don't revise window flags for system activity :ActivityRecord{90637794 u0 com.coloros.calculator/com.android.calculator2.Calculator t19091} 行 3281: 11-02 14:48:13.375 1707 5019 D OplusStartingWindowManager: allowUseSnapshot ==> record =:ActivityRecord{90637794 u0 com.coloros.calculator/com.android.calculator2.Calculator t19091},newTask =:true,taskSwitch =:true,processRunning =:true,activityCreated =:false 行 3285: 11-02 14:48:13.376 1707 5019 D OplusStartingWindowManager: updateStartingRecords activity=ActivityRecord{90637794 u0 com.coloros.calculator/com.android.calculator2.Calculator t19091}, isAdd=true, size=156, call by:com.android.server.wm.OplusAppQuickStartController.attachExStartingSurfaceInner:811 com.android.server.wm.OplusAppQuickStartController.attachExStartingSurface:767 com.android.server.wm.QuickStartController.attachExStartingSurface:113 com.android.server.wm.ActivityRecordExtImpl.attachExStartingSurface:3549 com.android.server.wm.ActivityRecord.addStartingWindow:2843 行 3344: 11-02 14:48:13.389 1707 5019 D OplusStartingWindowManager: hookAddStartingWindow: not support forcePreview! ActivityRecord{90637794 u0 com.coloros.calculator/com.android.calculator2.Calculator t19091} 行 3345: 11-02 14:48:13.389 1707 5019 D OplusStartingWindowManager: hasSplashWindowFlag: hasFlag=false, mStartingWindowFlags=0x0 行 3346: 11-02 14:48:13.389 1707 5019 D OplusStartingWindowManager: hookAddStartingWindow: not supportSnapshotPreview! 行 3349: 11-02 14:48:13.391 1707 5019 D OplusStartingWindowManager: updateStartingRecords activity=ActivityRecord{90637794 u0 com.coloros.calculator/com.android.calculator2.Calculator t19091}, isAdd=true, size=156, call by:com.android.server.wm.ActivityRecordExtImpl.updateStartingRecords:3219 com.android.server.wm.ActivityRecord.scheduleAddStartingWindow:2906 com.android.server.wm.ActivityRecord.addStartingWindow:2851 com.android.server.wm.ActivityRecord.showStartingWindow:8911 com.android.server.wm.ActivityRecord.showStartingWindow:8806 行 3378: 11-02 14:48:13.409 1707 5019 D OplusStartingWindowManager: reviseWindowFlagsForStarting ar =:ActivityRecord{90637794 u0 com.coloros.calculator/com.android.calculator2.Calculator t19091}, activityCreated =:false, RUS version:20251009 行 3379: 11-02 14:48:13.409 1707 5019 D OplusStartingWindowManager: hasSplashWindowFlag: hasFlag=false, mStartingWindowFlags=0x0 行 3380: 11-02 14:48:13.409 1707 5019 D OplusStartingWindowManager: we don't revise window flags for system activity :ActivityRecord{90637794 u0 com.coloros.calculator/com.android.calculator2.Calculator t19091} 行 3402: 11-02 14:48:13.410 1707 5019 D OplusStartingWindowManager: notifyNoStartingWindow: act=com.coloros.calculator/com.android.calculator2.Calculator, code=2304 行 3734: 11-02 14:48:13.502 1707 4669 D OplusStartingWindowManager: addStartingBackColorLayerIfNeed no need, win:Window{5d8a833 u0 Splash Screen com.coloros.calculator},isStartingBackColorLayerAdded:false 行 3769: 11-02 14:48:13.568 1707 1749 D OplusStartingWindowManager: removeStartingBackColorLayerIfNeed no need, win:Window{5d8a833 u0 Splash Screen com.coloros.calculator} 行 3785: 11-02 14:48:13.576 1707 4723 D OplusStartingWindowManager: isLayerMatchToStartingWindow packageClassName:com.katanlabs.bubblepop/com.google.firebase.MessagingUnityPlayerActivity forceWaitLayer:null 行 3786: 11-02 14:48:13.576 1707 4723 D OplusStartingWindowManager: isLayerMatchToStartingWindow , activityHasSurfaceView:false, isLayerMatchToRecord:false, isSurfaceViewLayer:false, layerName:Splash Screen com.coloros.calculator#1437878, mStartingRecords:[UniqueWeakReference@99eeeac[null], UniqueWeakReference@d705209[null], UniqueWeakReference@93d9af5[null], UniqueWeakReference@69d33dd[null], UniqueWeakReference@8832ef5[null], UniqueWeakReference@aa96ca2[null], UniqueWeakReference@79425c0[null], UniqueWeakReference@5c708b3[null], UniqueWeakReference@df43acf[null], UniqueWeakReference@f751d09[null], UniqueWeakReference@adf5f7e[null], UniqueWeakReference@649f25f[null], UniqueWeakReference@a6ddef6[null], UniqueWeakReference@497f1bf[null], UniqueWeakReference@716dae7[null], UniqueWeakReference@ca733cc[null], UniqueWeakReference@427fe74[null], UniqueWeakReference@97b337c[null], UniqueWeakReference@ff7e429[null], UniqueWeakReference@fc4d12d[null], UniqueWeakReference@f170cd2[null], UniqueWeakReference@2223634[null], UniqueWeakReference@ecc6a7e[null], UniqueWeakReference@f72df2e[null], UniqueWeakReference@9b2e991[null], UniqueWeakReference@52aa757[null], UniqueWeakReference@316726[null], UniqueWeakReference@fee5d65[null], UniqueWeakReference@40a48cc[null], UniqueWeakReference@102cbb0[null], UniqueWeakReference@2b313ee[null], UniqueWeakReference@e3bde1f[null], UniqueWeakReference@8dfbfbf[null], UniqueWeakReference@1def358[null], UniqueWeakReference@1c9017[null], UniqueWeakReference@67bcb4a[null], UniqueWeakReference@86e82c6[null], UniqueWeakReference@6b65cd6[null], UniqueWeakReference@e1266cf[null], UniqueWeakReference@5e8da71[null], UniqueWeakReference@7faddc5[null], UniqueWeakReference@b41e182[null], UniqueWeakReference@a32dc4b[null], UniqueWeakReference@a5a59b1[null], UniqueWeakReference@5be32b9[null], UniqueWeakReference@f49b2bc[null], UniqueWeakReference@1c80d84[null], UniqueWeakReference@d625eff[null], UniqueWeakReference@c3c778e[null], UniqueWeakReference@be5a3d3[null], UniqueWeakReference@1606e32[null ... 行 4661: 11-02 14:48:14.210 1707 4508 D OplusStartingWindowManager: addStartingBackColorLayerIfNeed no need, win:Window{5c5b9c5 u0 com.coloros.calculator/com.android.calculator2.Calculator},isStartingBackColorLayerAdded:false 行 5242: 11-02 14:48:14.561 1707 1749 D OplusStartingWindowManager: interceptRemoveStartingWindow: packageName=com.coloros.calculator, componentName=com.coloros.calculator/com.android.calculator2.Calculator, isSnapshot=false, startingSurfaceRunnable=null, isDrawCompleted=false, hasSurfaceView=false, inTransition=false 行 5244: 11-02 14:48:14.561 1707 1749 D OplusStartingWindowManager: hasSplashWindowFlag: hasFlag=false, mStartingWindowFlags=0x0 行 5245: 11-02 14:48:14.561 1707 1749 D OplusStartingWindowManager: interceptRemoveStartingWindow: hasSplashWindowFlag() return false for activity=ActivityRecord{90637794 u0 com.coloros.calculator/com.android.calculator2.Calculator t19091} 行 5286: 11-02 14:48:14.586 1707 4508 D OplusStartingWindowManager: hasRemoveStartingWindowImmediatelyFlag: has=false, mStartingWindowFlags=0x0 行 5287: 11-02 14:48:14.586 1707 4508 D OplusStartingWindowManager: hasSplashWindowFlag: hasFlag=false, mStartingWindowFlags=0x0 行 5289: 11-02 14:48:14.586 1707 4508 D OplusStartingWindowManager: createStartingWindowExitAnimationForPackage duration =:0,windowState =:Window{5d8a833 u0 Splash Screen com.coloros.calculator} 行 5364: 11-02 14:48:14.607 1707 1749 D OplusStartingWindowManager: supportWindowPreviewWhenStartingWindowExit Entry =: StartingWindowAttributeCache Entry : [ windowPreviewType : 0,windowSnapshotPreviewToken : null,supportSnapshotPreview : false,supportTitlePreview : false,startingWindowTitle : null ],spend time =: 24077 行 5365: 11-02 14:48:14.607 1707 1749 D OplusStartingWindowManager: putSnapshotForTaskPreview: mRequestStoreAppTokenSnapshot=false, mAllowAppSnapshot=true, activity=ActivityRecord{90637794 u0 com.coloros.calculator/com.android.calculator2.Calculator t19091} 行 5465: 11-02 14:48:14.630 1707 6817 D OplusStartingWindowManager: skip remove starting window for activity = ActivityRecord{9972313 u0 com.android.launcher/.Launcher t19232} ,ar != topActivityContainsStartingWindow on activityStopped 行 5469: 11-02 14:48:14.631 1707 6817 D OplusStartingWindowManager: updateStartingRecords activity=ActivityRecord{9972313 u0 com.android.launcher/.Launcher t19232}, isAdd=false, size=156, call by:com.android.server.wm.OplusStartingWindowManager.onActivityStopped:2920 com.android.server.wm.ActivityRecordExtImpl.onActivityStopped:1826 com.android.server.wm.ActivityRecord.activityStopped:7991 com.android.server.wm.ActivityClientController.activityStopped:306 android.app.IActivityClientController$Stub.onTransact:710 行 6443: 11-02 14:48:15.436 1707 4388 D OplusStartingWindowManager: addStartingBackColorLayerIfNeed no need, win:Window{3dd44f2 u0 Toast},isStartingBackColorLayerAdded:false
11-04
<think>我们正在分析一段系统日志,重点是关于OplusStartingWindowManager(可能是OPPO定制Android系统中管理启动窗口的模块)的行为。日志记录了在启动计算器应用(com.coloros.calculator)时的启动窗口管理过程。 ### 日志关键点分析 1. **启动窗口标志检查** - 多次出现`hasSplashWindowFlag: hasFlag=false, mStartingWindowFlags=0x0`,表明该Activity没有设置启动窗口的标志位。 - 日志中明确提到“we don't revise window flags for system activity”,说明系统应用(计算器)可能被特殊处理。 2. **启动窗口添加与移除** - 尝试添加启动窗口(`addStartingWindow`)但被拒绝:`hookAddStartingWindow: not supportSnapshotPreview!`和`hookAddStartingWindow: not support forcePreview!`。 - 在移除阶段:`interceptRemoveStartingWindow: hasSplashWindowFlag() return false`,同样因为标志位不存在,所以没有启动窗口可移除。 3. **后台颜色层管理** - 多次出现`addStartingBackColorLayerIfNeed no need`和`removeStartingBackColorLayerIfNeed no need`,表明不需要为启动窗口添加背景颜色层,进一步说明启动窗口未被使用。 4. **启动记录更新** - `updateStartingRecords`被多次调用,记录Activity的添加和移除,但`size=156`表明有大量记录,可能系统同时管理了许多Activity的启动状态。 5. **启动窗口跳过原因** - 在行5465:`skip remove starting window for activity = ActivityRecord{...} ,ar != topActivityContainsStartingWindow on activityStopped`,表明在Activity停止时,由于不是顶部Activity,跳过移除启动窗口。 ### 问题诊断 从日志看,计算器应用(com.coloros.calculator)在启动过程中,系统尝试为其添加启动窗口(Splash Screen),但由于以下原因被拒绝: - 该应用是系统应用,且可能配置为不使用启动窗口(或者启动窗口被禁用)。 - 启动窗口的标志位(mStartingWindowFlags)为0,即没有设置任何标志(如强制预览、快照预览等)。 因此,整个流程中,启动窗口并未实际添加,后续的移除操作也自然跳过。这符合日志中多次出现的“no need”和“return false”等描述。 ### 优化建议 1. **避免不必要的检查** 对于已知不使用启动窗口的系统应用(如计算器),可以在早期检查中直接跳过,减少日志噪音和CPU开销。 2. **精简日志输出** 当前日志过于冗余(如重复打印相同的标志检查),可考虑合并相同Activity的连续操作日志,或降低日志级别。 3. **启动记录管理优化** `updateStartingRecords`的`size=156`过大,可能存在无效引用(如日志中`UniqueWeakReference@... [null]`),建议定期清理弱引用队列。 ### 改进代码示例 ```java // 在OplusStartingWindowManager中增加系统应用白名单 private static final Set<String> NO_SPLASH_SYSTEM_APPS = new ArraySet<>(); static { NO_SPLASH_SYSTEM_APPS.add("com.coloros.calculator"); // 添加其他系统应用包名 } // 在添加启动窗口前检查 boolean shouldAddStartingWindow(ActivityRecord ar) { if (NO_SPLASH_SYSTEM_APPS.contains(ar.packageName)) { logD(TAG, "Skip splash for system app: " + ar.packageName); return false; } // 原有逻辑... } ``` §§相关问题§§ 1. Android系统如何区分系统应用和普通应用以实施不同的启动窗口策略? 2. 在定制ROM中,启动窗口标志位(mStartingWindowFlags)通常由哪些因素决定? 3. 如何有效管理大量Activity的启动记录(如WeakReference)以避免内存泄漏? 4. 启动窗口被跳过对应用冷启动性能有何影响? 5. 如何设计动态配置系统以减少日志输出量同时保留关键调试信息? </think>这段日志展示了 OPPO 定制系统(ColorOS)中启动窗口管理的详细流程,核心问题在于计算器应用(com.coloros.calculator)的启动窗口被跳过。以下是关键分析: ### 启动窗口失效原因诊断 ```mermaid graph TD A[启动计算器Activity] --> B{检查启动窗口条件} B -->|系统应用| C[跳过窗口标志修改] B -->|强制预览不支持| D[hookAddStartingWindow失败] B -->|快照预览不支持| E[hookAddStartingWindow失败] D --> F[无启动窗口标志] E --> F F --> G[拦截移除操作] G --> H[无动画退出] ``` 1. **系统应用特殊处理** `行3278/3380` 明确显示系统应用(计算器)被跳过窗口标志修改: `we don't revise window flags for system activity` 2. **强制预览机制失效** `行3344` 暴露关键限制: `hookAddStartingWindow: not support forcePreview!` - 定制系统未启用强制预览功能 3. **快照预览不支持** `行3346` 二次确认功能缺失: `hookAddStartingWindow: not supportSnapshotPreview!` - 导致 `行5245` 的窗口标志始终为 `0x0` 4. **异常移除流程** `行5289` 显示创建了0时长的退出动画: `createStartingWindowExitAnimationForPackage duration=0` - 相当于立即移除不存在的启动窗口 ### 启动窗口管理缺陷 1. **功能开关冲突** ```java // 伪代码逻辑漏洞 if (isSystemApp) disableFlags(); // 系统应用禁用标志 if (!supportForcePreview) disableSnapshot(); // 无强制预览则禁用快照 ``` 双重禁用导致启动窗口必然失败 2. **资源泄漏风险** `行3786` 显示弱引用列表积累大量 `[null]` 条目: `mStartingRecords:[UniqueWeakReference@99eeeac[null], ...]` - 未清理无效引用导致内存浪费 3. **窗口层级管理混乱** ```java 行3734:为计算器添加背景层 -> 跳过 行3769:为计算器移除背景层 -> 跳过 行4661:再次尝试添加背景层 -> 跳过 ``` 同一窗口的重复操作暴露状态同步问题 ### 优化方案 ```java // 修复系统应用的特殊处理逻辑 boolean shouldAddStartingWindow(ActivityRecord ar) { // 允许系统应用启用启动窗口 if (isSystemApp(ar) && hasCustomSplashConfig(ar)) { return true; // 例外放行 } return defaultCheck(ar); } // 增加资源清理机制 void purgeNullReferences() { mStartingRecords.removeIf(ref -> ref.get() == null); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值