360笔试:修复方程

题目描述

输入数据只包含合法数字和+或者=,判断是否插入一个数字使得左右两边数值相等,如16=1+23,在1后面插入0,得到16=10+23

解题思路

通过枚举的方法,往结果小的一边的所有可能位置插入0-9的数字「注意处理前导0」,然后找到左右两边相等的情况

代码实现

package main

import (
    "fmt"
    "strconv"
    "strings"
)

func Solution(op []string) {
    // 1. 在最小值的那边插入
    insert := func(fu []byte, target int) bool {
        var l, r int // 记录一个数的左右边界
        for i := 0; i < len(fu); i++ {
            if fu[i] >= '0' && i <= '9' {
                r++
            } else {
                // 一共有n+1种插法
                tfu := fu[l:r]
                n := r - l
                for k := n; k >= 0; k-- {
                    for j := 0; j < 10; j++ {
                        tmp := ""
                        if k == 0 && j == 0 {
                            continue
                        }
                        // 拼接前部分
                        tmp += string(fu[:l])
                        // 拼接当前数字前部分
                        tmp += string(tfu[:k])
                        // 插入数字并拼接剩余部分
                        tmp = tmp + string(byte('0'+j)) + string(tfu[k:]) + string(fu[r:])
                        if getValue(string(tmp)) > target {
                            break
                        }
                        if getValue(string(tmp)) == target {
                            return true
                        }
                    }
                }
                r++
                l = r
            }
        }
        return false
    }

    for _, ps := range op {
        fun := strings.Split(ps, "=")
        l, r := getValue(fun[0]), getValue(fun[1])
        if l < r {
            if insert([]byte(fun[0]), r) {
                fmt.Println("Yes")
            } else {
                fmt.Println("No")
            }
        } else if l > r {
            if insert([]byte(fun[1]), l) {
                fmt.Println("Yes")
            } else {
                fmt.Println("No")
            }
        } else {
            fmt.Println("Yes")
        }
    }
}
func getValue(x string) int {
    var sum int
    addSub := strings.Split(x, "+")
    for _, astr := range addSub {
        muSub := strings.Split(astr, "*")
        a, _ := strconv.Atoi(muSub[0])
        if len(muSub) > 1 {
            b, _ := strconv.Atoi(muSub[1])
            a = a * b
        }
        sum += a
    }
    return sum
}
#360笔试##算法题#
全部评论
感谢楼主分享的笔试题
点赞 回复 分享
发布于 2022-10-11 14:04 陕西

相关推荐

不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
评论
3
5
分享
牛客网
牛客企业服务