提取字符串中的最长数学表达式并计算(67%用例) C卷(Java&&Python&&C++&&Node.js&&C语言)

这篇具有很好参考价值的文章主要介绍了提取字符串中的最长数学表达式并计算(67%用例) C卷(Java&&Python&&C++&&Node.js&&C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提取字符串中的最长合法简单数学表达式,字符串长度最长的,并计算表达式的值。如果没有,则返回0
简单数学表达式只能包含以下内容
0-9数字,符号+-*
说明:
1.所有数字,计算结果都不超过long
2.如果有多个长度一样的,请返回第一个表达式的结果
3.数学表达式,必须是最长的,合法的
4.操作符不能连续出现,如+--+1是不合法的

输入描述:

字符串<

输出描述:

表达式值

示例1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

1-2abcd

输出

-1

Java版本

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        long res = 0;
        int maxLen = 0;
        int len = line.length();
        for (int i = 0; i < len; i++) {
            if (len - i <= maxLen) {
                break;
            }
            for (int j = i; j < len; j++) {
                String sub = line.substring(i, j + 1);
                Matcher matcher = Pattern.compile("(\\d+)([*+-])(\\d+)").matcher(sub);
                if (matcher.find() && j + 1 - i > maxLen) {
                    maxLen = j + 1 - i;
                    long first = Long.parseLong(matcher.group(1));
                    String op = matcher.group(2);
                    long second = Long.parseLong(matcher.group(3));
                    switch (op) {
                        case "+":
                            res = first + second;
                            break;
                        case "-":
                            res = first - second;
                            break;
                        case "*":
                            res = first * second;
                            break;
                    }
                }
            }
        }
        System.out.println(res);
    }
}

Python版本

import re

line = input()
res = 0
max_len = 0
length = len(line)

for i in range(length):
    if length - i <= max_len:
        break
    for j in range(i, length):
        sub = line[i:j+1]
        match = re.search(r'(\d+)([*+-])(\d+)', sub)
        if match and j + 1 - i > max_len:
            max_len = j + 1 - i
            first = int(match.group(1))
            op = match.group(2)
            second = int(match.group(3))
            if op == '+':
                res = first + second
            elif op == '-':
                res = first - second
            elif op == '*':
                res = first * second

print(res)

C++版本

#include <iostream>
#include <string>
#include <regex>
using namespace std;

int main() {
    string line;
    getline(cin, line);
    long long res = 0;
    int maxLen = 0;
    int len = line.length();
    for (int i = 0; i < len; i++) {
        if (len - i <= maxLen) {
            break;
        }
        for (int j = i; j < len; j++) {
            string sub = line.substr(i, j - i + 1);
            smatch match;
            regex pattern("(\\d+)([*+-])(\\d+)");
            if (regex_search(sub, match, pattern) && j + 1 - i > maxLen) {
                maxLen = j + 1 - i;
                long long first = stoll(match[1]);
                string op = match[2];
                long long second = stoll(match[3]);
                if (op == "+") {
                    res = first + second;
                } else if (op == "-") {
                    res = first - second;
                } else if (op == "*") {
                    res = first * second;
                }
            }
        }
    }
    cout << res << endl;
    return 0;
}

C语言版本

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

bool isOperator(char c) {
    return c == '+' || c == '-' || c == '*';
}

long long calculate(long long first, char op, long long second) {
    if (op == '+') {
        return first + second;
    } else if (op == '-') {
        return first - second;
    } else if (op == '*') {
        return first * second;
    }
    return 0;
}

int main() {
    char line[100];
    fgets(line, sizeof(line), stdin);

    long long res = 0;
    int maxLen = 0;
    int len = strlen(line);
    for (int i = 0; i < len; i++) {
        if (len - i <= maxLen) {
            break;
        }
        for (int j = i; j < len; j++) {
            char sub[100];
            strncpy(sub, &line[i], j - i + 1);
            sub[j - i + 1] = '\0';

            long long first, second;
            char op;
            int matched = sscanf(sub, "%lld%c%lld", &first, &op, &second);
            if (matched == 3 && isOperator(op) && j + 1 - i > maxLen) {
                maxLen = j + 1 - i;
                res = calculate(first, op, second);
            }
        }
    }

    printf("%lld\n", res);
    return 0;
}

Node.js版本文章来源地址https://www.toymoban.com/news/detail-850086.html

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

function isOperator(c) {
    return c === '+' || c === '-' || c === '*';
}

function calculate(first, op, second) {
    if (op === '+') {
        return first + second;
    } else if (op === '-') {
        return first - second;
    } else if (op === '*') {
        return first * second;
    }
    return 0;
}

rl.question('Enter a line: ', (line) => {
    let res = 0;
    let maxLen = 0;
    const len = line.length;

    for (let i = 0; i < len; i++) {
        if (len - i <= maxLen) {
            break;
        }
        for (let j = i; j < len; j++) {
            const sub = line.substring(i, j + 1);
            const match = sub.match(/(\d+)([*+-])(\d+)/);
            if (match && j + 1 - i > maxLen) {
                maxLen = j + 1 - i;
                const first = parseInt(match[1]);
                const op = match[2];
                const second = parseInt(match[3]);
                res = calculate(first, op, second);
            }
        }
    }

    console.log(res);
    rl.close();
});

到了这里,关于提取字符串中的最长数学表达式并计算(67%用例) C卷(Java&&Python&&C++&&Node.js&&C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【自然语言处理】NLP入门(一):1、正则表达式与Python中的实现(1):字符串构造、字符串截取

       语言 是一种使用具有共同处理规则的沟通指令的广义概念,这些指令可以通过视觉、声音或触觉等方式传递。语言可以分为自然语言、动物语言和计算机语言。    自然语言 是人类发展过程中形成的一种信息交流方式,它包括口语和书面语,并且反映了人类的思想。

    2024年03月12日
    浏览(120)
  • ChatGPT:字符串操作问题——提取包含括号的字符串中的题干内容

    String title = p.text().split(“(”)[0];为什么会报错 ChatGPT: 在这段代码中,您正在使用Java处理一个字符串(假设是HTML或文本),尝试将其分割成两部分,其中一个是从左括号\\\"(\\\"之前的内容。这段代码的目的是提取标题,但可能会出现一些错误,具体取决于输入字符串和代码的上

    2024年02月07日
    浏览(24)
  • 用python提取字符串中的数字

    # 1. 总体思路 ## 1.1. 获取一个字符串 from_string ## 1.2. 取出 from_string 的第一个数字 ### 1.2.1. 遍历 from_string ,找到第一个数字 ### 1.2.2. 存到 get_numbers 列表中 ### 1.2.3. 计算出第一个数字在 from_string 的位置 start_num ## 1.3. 从第一个数字处开始,遍历 from_string ### 1.3.1. 从第

    2023年04月11日
    浏览(32)
  • C# 如何提取字符串中的数字

    1、纯数字提取 2、带有小数点数字提取

    2024年02月13日
    浏览(32)
  • 使用正则提取字符串中的json数据

    需求: 我们有一个这样的字符串 `以下数据:{\\\"title\\\": \\\"标题一\\\", \\\"text\\\": \\\"内容一\\\", \\\"tag\\\": \\\"tag1\\\"}{\\\"title\\\": \\\"标题二\\\", \\\"text\\\": \\\"内容二\\\", \\\"tag\\\": \\\"tag二\\\"}` 需要提取里面的字符串 golang版本

    2024年02月10日
    浏览(29)
  • HJ65 查找两个字符串a,b中的最长公共子串

    Powered by: NEFU AB-IN Link 查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。 参考这篇我之前写的文章 blog,使用 字符串哈希和二分 实现的 这里用 dp 实现: f[i][j]表示 1~ai,1~bj且ai,bj为结尾的所有公共子串 属性:最长公共串长度 转移: 如果ai==b

    2024年02月09日
    浏览(30)
  • JavaScript从入门到精通系列第三十一篇:详解JavaScript中的字符串和正则表达式相关的方法

      文章目录 知识回顾 1:概念回顾 2:正则表达式字面量 一:字符串中正则表达式方法 1:split 2:search 3:match 4:replace         正则表达式用于定义一些字符串的规则,计算机可以根据正则表达式检查一个字符串是否符合规则,或者将字符串中符合规则的内容提取出来。

    2024年01月17日
    浏览(47)
  • js中的内置对象、数学对象、日期对象、数组对象、字符串对象

    car、computer div、p window、console 数学对象 Math (object类型) 1、圆周率 Math.PI 2、向下取整(返回值) Math.floor() 3、向上取整(返回值) Math.ceil() 4、四舍五入 Math.round() 5、随机数 0x1 Math.random() 6、绝对值 Math.abs() 7、最大值 Math.max() 8、最小值 Math.min() 9、指数幂 Math.pow(底数,指数) 10、平

    2024年01月24日
    浏览(30)
  • 代码随想录复习 1047. 删除字符串中的所有相邻重复项 150 逆波兰表达式求值 239 滑动窗口最大值

    1047. 删除字符串中的所有相邻重复项 代码如下  func removeDuplicates(s string) string {             var  stack []byte   //结果栈数组             for i := 0 ; i  len(s) ; i++ {                 if len(stack)  0  stack[len(stack)-1] == s[i] {  //如果当前遍历到的元素

    2024年02月05日
    浏览(37)
  • day11 代码回想录-栈与队列part02-有效的括号&删除字符串中的所有相邻重复项&逆波兰表达式求值

    大纲 ● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值 有效的括号 题目链接:20. 有效的括号 题目需要判断括号是否匹配 解题思路: 使用栈来实现,当为**{[( 时入栈,当遇到 )]} 时,判断栈顶元素释放能匹配。需要单独处理只有 右边**单个

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包