LeetCode——241.为运算表达式设计优先级
LeetCode——241.为运算表达式设计优先级
- 题目:不同优先级组合数字和运算符的所有可能结果
- 描述
- 示例
- 解决方法
- 代码实现
题目:不同优先级组合数字和运算符的所有可能结果
描述
给定一个由数字和运算符组成的字符串 expression
,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以按任意顺序返回答案。
提示:
- 1 <= expression.length <= 20
- expression 由数字和算符 ‘+’、‘-’ 和 ‘*’ 组成。
- 输入表达式中的所有整数值在范围 [0, 99]
- 输入表达式中的所有整数都没有前导 ‘-’ 或 ‘+’ 表示符号。
示例
输入示例:
示例 1:
输入:expression = "2-1-1"
输出:[0,2]
解释:
((2-1)-1) = 0
(2-(1-1)) = 2
示例 2:
输入:expression = "2*3-4*5"
输出:[-34,-14,-10,-10,10]
解释:
(2*(3-(4*5))) = -34
((2*3)-(4*5)) = -14
((2*(3-4))*5) = -10
(2*((3-4)*5)) = -10
(((2*3)-4)*5) = 10
解决方法
- 可以将字符串中的表达式分成两部分,再分别计算出两边的结果,最后将不同结果进行组合运算。
- 表达式拆分后要进行递归处理,直到拆分成单个数字就返回。
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>int* diffWaysToCompute(char* expression, int* returnSize);
int* compute(char* input, int start, int end, int* size);int* diffWaysToCompute(char* expression, int* returnSize) {return compute(expression, 0, strlen(expression) - 1, returnSize);
}int* compute(char* input, int start, int end, int* size) {int* result = NULL;*size = 0;int isNumber = 1;for (int i = start; i <= end; i++) {if (!isdigit(input[i])) { //判断是否是数字isNumber = 0;break;}}if (isNumber) { //纯数字int num = 0;for (int i = start; i <= end; i++) {num = num * 10 + (input[i] - '0'); //将字符串转化为数字}result = (int*)malloc(sizeof(int));result[0] = num;*size = 1;return result;}for (int i = start; i <= end; i++) {if (input[i] == '+' || input[i] == '-' || input[i] == '*') {int leftSize, rightSize;int* left = compute(input, start, i - 1, &leftSize); //不包含符号(i)int* right = compute(input, i + 1, end, &rightSize); //不包含符号(i)for (int l = 0; l < leftSize; l++) {for (int r = 0; r < rightSize; r++) {int val;switch (input[i]) {case '+': val = left[l] + right[r]; break;case '-': val = left[l] - right[r]; break;case '*': val = left[l] * right[r];break;}(*size)++;result = (int*)realloc(result, (*size) * sizeof(int)); //动态开辟空降result[*size - 1] = val;}}free(left);free(right);}}return result;
}void printResults(int* results, int size) {printf("[");for (int i = 0; i < size; i++) {printf("%d", results[i]);if (i < size - 1) {printf(", ");}}printf("]\n");
}int main() {char expression[] = "2-1-1";int returnSize;int* results = diffWaysToCompute(expression, &returnSize);printf("Possible results:\n");for (int i = 0; i < returnSize; i++) {printf("%d ", results[i]);}printf("\n");free(results);return 0;
}