公式字符串求值

import java.util.Deque;
import java.util.LinkedList;

/**
 * Created by lxw, liwei4939@126.com on 2017/11/1.
 * 公式字符串求值
 */
public class stringValue {
    
    public int getValue(String str){
        return value(str.toCharArray(), 0)[0];
    }
    
    public int[] value(char[] chars, int i){
        Deque<String> deq = new LinkedList<String>();
        int pre = 0;
        int[] bar = [];
        while (i < chars.length && chars[i] != ')'){
            if(chars[i] > '0' && chars[i] < '9'){
                pre = pre * 10 + chars[i++] - '0';
            } else if(chars[i] != '('){
                addNum(deq, pre);
                deq.addLast(String.valueOf(chars[i++]));
            } else {
                bar = value(chars, i+1);
                pre = bar[0];
                i = bar[1] + 1;
            }
        }
        addNum(deq, pre);
        return int[]{getNum(deq), i};
    }
    
    public void addNum(Deque<String> deque, int num){
        if(!deque.isEmpty()){
            int cur = 0;
            String top = deque.pollLast();
            if(top.equals("+") || top.equals("-")){
                deque.addLast(top);
            } else {
                cur = Integer.valueOf(deque.pollLast());
                num = top.equals("*") ? (cur * num) : (cur / num);
            }
        }
        deque.addLast(String.valueOf(num));
    }
    
    public int getNum(Deque<String> deque){
        int res = 0;
        boolean add = true;
        String cur = null;
        int num = 0;
        while (!deque.isEmpty()){
            cur = deque.pollFirst();
            if(cur.equals("+")){
                add= true;
            } else if(cur.equals("-")){
                add = false;
            } else {
                num = Integer.valueOf(cur);
                res += add ? num : (-num);
            }
        }
        return res;
    }
}

<think>我们正在处理一个关于在字符串中查找子字符串或字符位置的问题。根据用户的问题和提供的引用,我们可以总结出几种常见的方法:1.使用内置方法(如Java的indexOf,Python的find等)2.暴力匹配法(逐个字符比较)3.使用正则表达式(如Java中的Pattern和Matcher)我们将分别介绍这些方法,并给出示例代码。同时,根据系统指令,我们会将行内数学表达式用$...$表示,独立公式用$$...$$,并生成相关问题。###方法1:使用内置方法大多数编程语言都提供了内置的字符串查找方法。例如:-Java:`indexOf()`方法返回子字符串第一次出现的索引,如果没有找到则返回-1。-Python:`find()`方法类似,返回第一次出现的索引,找不到返回-1。示例(Java):```javaStringstr="Hello,world!";intindex=str.indexOf("world");//返回7```示例(Python):```pythons="Hello,world!"index=s.find("world")#返回7```###方法2:暴力匹配法如果我们需要自己实现查找逻辑,可以使用暴力匹配法。这种方法逐个字符比较,直到找到匹配或遍历完整个字符串。算法步骤:1.遍历源字符串的每个字符作为起始点(注意:当剩余字符长度小于目标字符串长度时停止)。2.从当前起始点开始,逐个比较源字符串和目标字符串的字符。3.如果全部匹配,返回起始索引;否则,从下一个字符重新开始比较。时间复杂度:最坏情况$O(n\timesm)$,其中$n$是源字符串长度,$m$是目标字符串长度。示例代码(Java)参考引用[4]:```javapublicstaticintviolenceAnalysis(Stringsrc,Stringtarget){inttargetLength=target.length();for(intsrcIndex=0;srcIndex<=src.length()-targetLength;srcIndex++){//如果首字符匹配,则比较后续字符if(src.charAt(srcIndex)==target.charAt(0)){booleanmatch=true;for(intj=1;j<targetLength;j++){if(src.charAt(srcIndex+j)!=target.charAt(j)){match=false;break;}}if(match){returnsrcIndex;}}}return-1;}```###方法3:使用正则表达式正则表达式也可以用于查找子字符串的位置,尤其当需要查找符合某种模式的子串时。示例(Java)参考引用[3]:```javaimportjava.util.regex.*;publicclassRegexExample{publicstaticvoidmain(String[]args){Stringtext="aaabaabaaaab";StringpatternString="ab";Patternpattern=Pattern.compile(patternString);Matchermatcher=pattern.matcher(text);if(matcher.find()){System.out.println("Foundatindex:"+matcher.start());}}}```###查找第N次出现的位置有时我们需要查找子字符串第N次出现的位置。我们可以循环调用内置方法或使用正则表达式。示例(Java)使用`indexOf`循环:```javapublicstaticintfindNthOccurrence(Stringsrc,Stringtarget,intn){intindex=-1;intstartIndex=0;for(inti=0;i<n;i++){index=src.indexOf(target,startIndex);if(index==-1){return-1;}startIndex=index+1;//从下一个位置开始查找}returnindex;}```示例(Python)使用`find`循环:```pythondeffind_nth_occurrence(src,target,n):start=0foriinrange(n):index=src.find(target,start)ifindex==-1:return-1start=index+1returnindex```###总结-简单查找:使用内置方法(如`indexOf`或`find`)最为方便。-需要控制查找过程或学习原理:暴力匹配法。-复杂模式匹配:正则表达式。根据不同的需求选择合适的方法。§§相关问题§§1.如何查找子字符串字符串中出现的所有位置?2.字符串查找算法(如KMP算法)是如何工作的?3.在字符串中查找子字符串时,如何提高效率?4.如何查找重叠出现的子字符串位置?</think>### 在字符串中查找子字符串或字符的位置 在编程中查找子字符串/字符的位置主要有三种方法,以下是具体实现和示例: #### 1. **使用内置方法(推荐)** 大多数编程语言提供内置函数直接获取位置: ```java // Java示例 String mainStr = "Hello, world!"; int position = mainStr.indexOf("world"); // 返回7 int charPos = mainStr.indexOf('o'); // 返回4 ``` - `indexOf()` 返回**首次出现**的索引(从0开始计数) - 未找到时返回 `-1` - 支持指定起始搜索位置:`indexOf("o", 5)` 从索引5开始搜索 #### 2. **暴力匹配法(手动实现)** 核心逻辑:逐字符比较目标串和源字符串[^4] ```java public static int findSubstring(String src, String target) { for (int i = 0; i <= src.length() - target.length(); i++) { boolean found = true; for (int j = 0; j < target.length(); j++) { if (src.charAt(i + j) != target.charAt(j)) { found = false; break; } } if (found) return i; // 返回匹配起始位置 } return -1; // 未找到 } ``` 时间复杂度:$O(n \times m)$(n=源串长度, m=目标串长度) #### 3. **查找第N次出现的位置** 使用循环或正则表达式定位特定次数的出现[^3]: ```java // 查找第2次出现 String str = "apple, banana, apple"; int count = 0; int index = -1; while ((index = str.indexOf("apple", index + 1)) != -1) { count++; if (count == 2) break; } System.out.println("第二次出现位置:" + index); // 输出14 ``` #### 4. **统计出现次数** 通过循环计数实现[^1]: ```python # Python示例 s = "abababab" sub = "aba" count = 0 start = 0 while (start := s.find(sub, start)) != -1: count += 1 start += 1 # 移动搜索起点 print(f"出现次数:{count}") # 输出3 ``` ### 关键注意事项 1. **索引规则**:多数语言从0开始计数位置 2. **大小写敏感**:`"A" != "a"` 3. **特殊字符**:需处理转义字符(如Java中的`\t`) 4. **性能考量**:长文本建议使用KMP/Boyer-Moore等高效算法 > 实际开发中优先使用语言内置方法,它们通常经过高度优化且不易出错[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值