[LC] 224. Basic Calculator

本文介绍了一种不使用内置eval函数实现基本计算器的方法,通过解析简单的数学表达式字符串并进行计算。文章详细讨论了如何利用栈来处理括号,并给出了具体的Java代码实现。

一、问题描述

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

Note: Do not use the eval built-in library function.


二、我的思路

想到在出现括号时用栈,但不知道java的栈怎么写……另外具体的边界条件也没想清楚。借鉴了discuss里的思路以后,写了代码

class Solution {
    public int calculate(String s) {
        char[] c = s.toCharArray();
        Stack<Integer> stack = new Stack<Integer>();
        
        int result = 0;
        int sign = 1;
        
        for(int i = 0; i < c.length; i ++){
            switch(c[i]){
                case '(':
                    stack.push(sign);
                    stack.push(result);
                    result = 0;
                    sign = 1;
                    break;
                case ')':
                    result = stack.pop() + stack.pop()*result;
                    break;
                case '+':
                    sign = 1;
                    break;
                case '-':
                    sign = -1;
                    break;
                case ' ':
                    break;  
                default:
                    if(Character.isDigit(c[i])){
                        int sum = c[i] - '0';
                        while(i + 1 <= c.length -1 && Character.isDigit(c[i+1])){	// Mind the condition!!!
                            sum = sum*10 + c[i + 1] - '0';
                            i ++;
                        }
                        result += sign * sum;
                    }
                    break;
            }
        }
        return result; 
    }
}
注意while的条件,以及sign和result什么时候复原。

三、淫奇技巧

思路都差不多,就是对五种字符分别处理,不同的是number的处理更优美了。

public int calculate(String s) {
    Stack<Integer> stack = new Stack<Integer>();
    int result = 0;
    int number = 0;
    int sign = 1;
    for(int i = 0; i < s.length(); i++){
        char c = s.charAt(i);
        if(Character.isDigit(c)){
            number = 10 * number + (int)(c - '0');
        }else if(c == '+'){
            result += sign * number;
            number = 0;
            sign = 1;
        }else if(c == '-'){
            result += sign * number;
            number = 0;
            sign = -1;
        }else if(c == '('){
            //we push the result first, then sign;
            stack.push(result);
            stack.push(sign);
            //reset the sign and result for the value in the parenthesis
            sign = 1;   
            result = 0;
        }else if(c == ')'){
            result += sign * number;  
            number = 0;
            result *= stack.pop();    //stack.pop() is the sign before the parenthesis
            result += stack.pop();   //stack.pop() now is the result calculated before the parenthesis
            
        }
    }
    if(number != 0) result += sign * number;
    return result;
}


四、不足

很多java的工具根本不知道……

Java Character:http://www.runoob.com/java/java-character.html


五、碎碎念

后天上午就要面试了,加油吖~

### 安卓10启动`com.android.calculator2.Calculator`报错Error type 3及Activity class不存在的原因与解决方案 在安卓10中,启动`com.android.calculator2.Calculator`时出现`Error type 3`以及`Activity class不存在`的错误,通常是由以下原因导致: #### 错误原因分析 1. **包名或Activity名称不正确** 如果指定的包名或Activity名称与实际安装的计算器应用不匹配,系统将无法找到对应的Activity类。这可能导致`Activity class不存在`的错误。可以通过以下命令检查设备上实际安装的计算器应用的包名和Activity名称: ```bash adb shell dumpsys package | grep -i calculator ``` 此命令会列出所有包含`calculator`关键字的包名及其相关信息[^1]。 2. **权限问** 在安卓10中,启动某些系统应用可能需要额外的权限。如果应用没有被授予适当的权限(例如`android.permission.INTERACT_ACROSS_USERS`),可能会导致启动失败并抛出`Error type 3`的错误。确保在`AndroidManifest.xml`中声明了必要的权限,并且目标应用支持跨用户交互。 3. **应用未安装或已被禁用** 如果目标计算器应用未安装或已被用户禁用,尝试启动它将导致`Activity class不存在`的错误。可以通过以下命令检查目标应用的状态: ```bash adb shell pm list packages | grep calculator adb shell pm path com.android.calculator2 ``` 如果目标应用未列出,则说明其未安装或已被卸载。 4. **系统限制** 某些安卓10设备可能对第三方应用启动系统应用的行为施加了限制。这可能导致即使包名和Activity名称正确,仍然无法成功启动目标应用。 #### 解决方案 1. **验证包名和Activity名称** 确保使用的包名和Activity名称与实际安装的应用匹配。例如,标准的安卓计算器应用通常使用以下信息: ```java "com.android.calculator2" // 包名 "com.android.calculator2.Calculator" // Activity名称 ``` 如果设备上的计算器应用来自其他厂商或第三方开发人员,则需要根据实际情况调整这些值。 2. **检查应用状态** 使用ADB命令确认目标应用是否已安装且未被禁用: ```bash adb shell pm enable com.android.calculator2 adb shell pm install-existing com.android.calculator2 ``` 3. **修改广播接收器逻辑** 在广播接收器中启动计算器应用时,确保使用了正确的Intent设置。以下是一个示例代码片段: ```java Intent calculatorIntent = new Intent(Intent.ACTION_MAIN); calculatorIntent.setClassName("com.android.calculator2", "com.android.calculator2.Calculator"); calculatorIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(calculatorIntent); ``` 如果目标应用的包名或Activity名称不同,请根据实际情况调整上述代码中的值。 4. **处理权限问** 在`AndroidManifest.xml`中添加必要的权限声明: ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" /> ``` 同时,确保应用具有足够的权限来执行跨用户操作。 5. **测试与调试** 使用Logcat工具捕获详细的错误日志,以进一步分析问的根本原因。例如,运行以下命令查看相关日志: ```bash adb logcat | grep -i activity ``` #### 注意事项 - 修改系统行为可能需要Root权限,尤其是在禁用系统应用或添加自定义广播接收器时。 - 不同设备的计算器应用包名可能不同,建议通过`adb shell dumpsys package | grep -i calculator`命令查找具体的包名[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值