面试题目:(4)给表达式添加运算符

ops/2024/9/24 3:26:38/

目录

题目

代码

思路解析

例子


题目

  • 题目
    • 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+、- 或 * ,
  • 返回
    • 所有能够得到 target 的表达式。
    • 1 <= num.length <= 10
    • num 仅含数字
    • -231 <= target <= 231 - 1
  • 注意
    • 返回表达式中的操作数 不应该 包含前导零。
  • 示例 1:
    • 输入: num = "123", target = 6
    • 输出: ["1+2+3", "1*2*3"]
    • 解释: “1*2*3” 和 “1+2+3” 的值都是6。
  • 示例 2:
    • 输入: num = "232", target = 8
    • 输出: ["2*3+2", "2+3*2"]
    • 解释: “2*3+2” 和 “2+3*2” 的值都是8。
  • 示例 3:
    • 输入: num = "3456237490", target = 9191
    • 输出: []
    • 解释: 表达式 “3456237490” 无法得到 9191 。

代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>void evaluate(int* num_list, int* num_flag, int n, int target) {int end = num_list[0]; for (int i = 1; i < n; i++) {if (num_flag[i] == 1) {end *= num_list[i];} else if (num_flag[i] == 2) {end += num_list[i];} else if (num_flag[i] == 3) {end -= num_list[i];}}if (end == target) {printf("找到表达式: ");for (int i = 0; i < n; i++) {if (i > 0) {if (num_flag[i] == 1) printf("*");if (num_flag[i] == 2) printf("+");if (num_flag[i] == 3) printf("-");}printf("%d", num_list[i]);}printf(" = %d\n", target);}
}void backtrack(int* num_list, int* num_flag, int n, int target, int pos) {if (pos == n) {evaluate(num_list, num_flag, n, target);return;}for (int i = 1; i <= 3; i++) { // 遍历三种运算符num_flag[pos] = i;backtrack(num_list, num_flag, n, target, pos + 1);// 递归下一个运算符}
}int main() {char num[256] = "";int target;printf("num = ");fgets(num, sizeof(num), stdin);if (strlen(num) > 10) return 0;int n = strlen(num) - 1;int num_list[n];for (int i = 0; i < n; i++) {if (num[i] >= '0' && num[i] <= '9') {num_list[i] = num[i] - '0';} else {return 0;}}printf("target = ");scanf("%d", &target);if (target > 230 || target < -231) return 0;int num_flag[n]; // 保存操作符的数组backtrack(num_list, num_flag, n, target, 1);return 0;
}

思路解析

  • 接收输入的字符串和目标数字
  • 判断其是否输入正确
  • 将字符串数字转为整数数组
  • 调用递归backtrack函数,从第一位开始递归
    • 判断递归索引是否是到最后一位
      • 是的话调用验算函数
        • 递归标志位数组进行判断加减算出答案
        • 判断答案于目标数字是否一样,一样就打印
    • 不是的话就继续就进行对标志位数组进行初始化
      • 一个数字一个标志位,如果是1就表示乘法,2为加法,3为减法
      • 递归索引+1进行递归

简单来说就是先从第一个字符开始变化标志位,从1到2到3,也就从乘法加法减法,但在第一个执行乘法前,后面的要先完成从1到2到3的变化,所以就是在第一个执行1的时候要等第二个数字从1到2到3变化完才进行变2,然后又要等第二个数字从1到2到3才变3,如果有第三个数字的话第二个数字也要等第三个数字变化完,一层一层递归,直到递归到最后一个数字后,才开始进行计算

例子

输入 1234   目标 10


http://www.ppmy.cn/ops/96870.html

相关文章

7个领先数据仓库和数据库的深入比较

在当今的数字时代&#xff0c;数据仓库和数据湖已成为存储和分析大量数据的核心&#xff0c;为各种数据管理挑战提供可扩展的解决方案。探索数据仓库和数据库的多样化世界&#xff0c;比较AmazonRedshift和MySQL等主要参与者&#xff0c;以确定最适合您的数据管理需求的解决方案…

SQL - 汇总与分组

聚合函数 MySQL自带一堆内置函数&#xff0c;其中一些叫聚合函数&#xff0c;用它们汇总数据&#xff0c;因为它们取某一列的值并聚合它们&#xff0c;导出一个单一值。并且聚合函数只会运行非空值&#xff0c;如果列中有的值是null&#xff0c;它不会被算在内。 max(), min(),…

keepalived讲解及练习

目录 1、keepalived介绍 1.1 keepalived简介 2、高可用集群 2.1 集群类型 2.2 系统可用性 2.3 系统故障 2.4 实现高可用 3、VRRP 3.1 VRRP&#xff1a;Virtual Router Redundancy Protocol 3.2 VRRP 相关术语 3.3 VRRP相关技术 4、 keepalived实验 4.1 全局配置 4…

如何去除抖音视频水印,还原视频的3种方法

抖音等短视频平台已经成为人们获取信息和娱乐的重要渠道。然而&#xff0c;视频上的水印往往会影响到观看体验&#xff0c;甚至在某些情况下限制了视频的分享和使用。本文将介绍三种去除抖音视频水印的方法&#xff0c;帮助用户还原视频的原始面貌。 工具一&#xff1a;奈斯水…

HAProxy的详解

一、介绍 1.1 定义 HAProxy是一个使用C语言编写的自由及开放源代码软件&#xff0c;其提供高可用性、负载均衡&#xff0c;以及基于TCP和HTTP的应用程序代理。 HAProxy特别适用于那些负载特大的web站点&#xff0c;这些站点通常又需要会话保持或七层处理。HAProxy运行在当前…

【网络 day1】

服务器可以循环接收客户端的数据&#xff1b;当客户端退出后&#xff0c; 服务器阻塞等待下一个客户端的连接&#xff0c;而后继续通信&#xff1b;当有客户端连接时&#xff0c; 服务器端 打印客户端的IP 和 Port信息&#xff1b;将代码的 send 和 recv 改为 write 和 read&am…

C2M商业模式分析与运营平台建设解决方案(三)

C2M&#xff08;Customer to Manufacturer&#xff09;商业模式通过直接将消费者需求与制造商对接&#xff0c;打破了传统生产与消费之间的壁垒&#xff0c;本文将探讨如何通过构建一个智能化运营平台&#xff0c;利用大数据分析、人工智能技术以及灵活的供应链管理&#xff0c…

【MySQL】5.0 入门学习(五)——MySQL源码了解及MySQL初始化设置

1.0 MySQL源码目录主要包括&#xff1a;客户端代码、服务端代码、测试工具、其他库文件。当然&#xff0c;看懂源代码得有一定的C语言基础。 image image.gif ​ BUILD&#xff1a;各种平台的编译脚本&#xff0c;可以用来制作各平台的二进制版本 client&#xff1a;客户端目录…