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

简介: 力扣每日一题: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
  1. 如何判断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)




相关文章
|
5月前
力扣-2029-石子游戏-‘屎山’代码
力扣-2029-石子游戏-‘屎山’代码
42 3
|
6月前
|
算法
leetcode代码记录(全排列 II
leetcode代码记录(全排列 II
47 4
|
6月前
leetcode代码记录(最长回文子串
leetcode代码记录(最长回文子串
46 2
|
6月前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
44 2
|
6月前
leetcode代码记录(最长连续递增序列
leetcode代码记录(最长连续递增序列
38 2
|
6月前
leetcode代码记录(第一个出现两次的字母
leetcode代码记录(第一个出现两次的字母
34 2
|
6月前
|
算法
leetcode代码记录(买卖股票的最佳时机 IV
leetcode代码记录(买卖股票的最佳时机 IV
37 2
|
6月前
|
算法
leetcode代码记录(全排列
leetcode代码记录(全排列
49 1
|
6月前
|
索引
leetcode代码记录(Z 字形变换
leetcode代码记录(Z 字形变换
44 1
|
6月前
leetcode代码记录(回文数
leetcode代码记录(回文数
40 1