力扣每日一题:1881.插入后的最大值 合并考虑正负场景,避免代码重复

1881.插入后的最大值

https://leetcode-cn.com/problems/maximum-value-after-insertion/solution/1881cha-ru-hou-de-zui-da-zhi-he-bing-kao-g8ku/

难度:中等

题目:

给你一个非常大的整数 n 和一个整数数字 x ,大整数 n用一个字符串表示。n 中每一位数字和数字 x 都处于闭区间 [1, 9] 中,且 n 可能表示一个 负数 。

你打算通过在 n 的十进制表示的任意位置插入 x 来 最大化 n 的 数值 。但 不能 在负号的左边插入 x 。

例如,如果 n = 73 且 x = 6 ,那么最佳方案是将 6 插入 7 和 3 之间,使 n = 763 。
如果 n = -55 且 x = 2 ,那么最佳方案是将 2 插在第一个 5 之前,使 n = -255 。
返回插入操作后,用字符串表示的n 的最大值。

提示:

1 <= n.length <= 10 ** 5
1 <= x <= 9
n 中每一位的数字都在闭区间 [1, 9] 中。
n代表一个有效的整数。
当 n 表示负数时,将会以字符 '-' 开始。

示例:

示例 1:
输入:n = "99", x = 9
输出:"999"
解释:不管在哪里插入 9 ,结果都是相同的。

示例 2:
输入:n = "-13", x = 2
输出:"-123"
解释:向 n 中插入 x 可以得到 -213、-123 或者 -132 ,三者中最大的是 -123 。

分析

这道题如果没有负数的场景,那么只能算很简单的简单题(虽然有负数还是很简单...)。

  1. 首先我们需要分析N是否为负数,判断方式就是看N的第一位是不是字符串的“-”
    • 如果是正数,我们从n[0]开始遍历,否则从n[1]开始
    • 设置默认flag = 1,如果为负数是flag = -1
  2. 如何判断x插入哪里?
    • 如果是正数,x当然要插入在大于等于n[i]的地方
    • 如果是负数,x需要插入在小于n等于[i]的地方
    • 当n为负数时,由于flag为负,需要过滤掉等于的场景才能满足题意
    • 由于正负不同,我们使用flag,flag * x > flag * n[i],就能将两种场景归一化,因为负数时flag = -1

解题:

class Solution:
    def maxValue(self, n: str, x: int) -> str:
        start, flag, ln = 0, 1, len(n)
        if n[0] == '-':
            start, flag = 1, -1
        for i in range(start, ln):
            if x * flag > int(n[i]) * flag:
                return n[:i] + str(x) + n[i:]
        return n + str(x)

欢迎关注我的公众号: 清风Python,带你每日学习Python算法刷题的同时,了解更多python小知识。

我的个人博客:https://qingfengpython.cn

力扣解题合集:https://github.com/BreezePython/AlgorithmMarkdown

你可能感兴趣的:(算法之美,字符串,python,算法,java,编程语言)