数字组合转字母|删除二叉树节点|字符串相乘|打家劫舍ii-无序数组第k大 |无序数组前k大|两个有序数组合并|中文数字转换为整数|最大连续子数组和|零钱凑数|两个有序数组寻找第k大的数

   日期:2024-12-28    作者:nsq6m 移动:http://oml01z.riyuangf.com/mobile/quote/76559.html
1-26个数字分别代表26个字符(A-z)输入"12326〞就可以拆分为【1,2,3,2,6】、
(12, 3, 2, 6]. [1, 23, 2, 6]【1,23,26】、【12,3,26】等,将每种组合转成成对应字母输出,输出所有可能的结果
返回所有可能的转换结果
// 将数字串转换成字母串

 

数字组合转字母|删除二叉树节点|字符串相乘|打家劫舍ii-无序数组第k大 |无序数组前k大|两个有序数组合并|中文数字转换为整数|最大连续子数组和|零钱凑数|两个有序数组寻找第k大的数

 

解题思路
当前节点比删除值小,右子树的根变为右子树中删除;
当前节点比删除值大,左子树的根变为左子树中删除;
当前就是要被删的节点,如果它没有左子树或没有右子树,可以直接平移嫁接。
否则需要找到左子树最大值或右子树最小值作为新的根。

 链接: https://leetcode.cn/problems/delete-node-in-a-bst/solutions/1531382/-by-himymben-7sey/

 

题目:给定两个以字符串形式表示的非负整数  和 ,返回  和  的乘积,它们的乘积也表示为字符串形式。

  1.  和  的长度小于110。
  2. 和 只包含数字 。
  3. 和  均不以零开头,除非是数字 0 本身。
  4. 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理

基于竖式乘法,先逐位乘算,再进位相加:

 

 

链接: https://segmentfault.com/a/1190000021756333?utm_source=tag-newest

 

 

 

 

 

 

链接:https://leetcode.cn/problems/house-robber-ii/solutions/1097624/geng-wei-jian-ji-de-golang-ban-ben-by-hz-6fdl/

 

 

 

 

链接: https://www.cnblogs.com/zuofaqi/p/10209648.html

 

这个算法的基本思想是基于快速排序,它通过选取一个“基准”元素,将数组分成两个部分:小于基准的和大于基准的。然后根据需要的个数决定继续在哪一部分进行查找。

 

 

 

由题可知,我们需要将第二个数组的元素合并到第一个数组之后返回

两个数组都是有序的,因此对于每个想要插入数组的元素,我们只要找到首个大于这个元素的数,将其插入到这个数的前方即可

 

时间复杂度:O(m+n)执行的循环次数为数组二的个数n,也就是插入数组一的元素个数,再加上指针搜索插入位置的移动长度,最坏情况等于数组一的长度m
空间复杂度:O(1),常数次空间


链接: https://segmentfault.com/a/1190000041355583

 

下面是一个用 Go 语言实现的函数,它将中文数字(不超过一亿)转换为整数。代码中考虑了中文数字的各种形式,包括“万”、“千”、“百”等单位,并处理了零的情况。

 

### 代码说明:
1. **映射表**:
- `chineseNumbers` 用于存储中文数字字符到对应整数的映射。
- `units` 用于存储中文单位字符(如“十”、“百”、“千”、“万”)到其对应数值的映射。

2. **主逻辑**:
- 循环遍历输入字符串中的每个字符。
- 如果字符是中文数字,则将其添加到当前累计值 `current`。
- 如果字符是单位,更新 `current` 的值。如果遇到“万”,则将 `current` 加入到 `result` 中,并重置 `current` 为 0。
- 最后将任何剩余的 `current` 添加到结果 `result` 中。

3. **错误处理**:
- 对于无效字符,返回错误。

### 示例输出:
对于输入 `"六千四百八十五万七千四百零八"`,输出将是:
```
The integer value is: 64857408
```

 

 

 

 

### 代码说明:
- **maxSubArray 函数**:
- 输入一个整数数组 `nums`。
- 使用两个变量 `maxSum` 和 `currentSum` 来跟踪最大和当前的连续子数组和。
- 使用 `start`, `end`, 和 `tempStart` 来记录当前的子数组的起始和结束索引。
- 当 `currentSum` 小于零时,重置 `currentSum` 并更新 `tempStart` 为当前元素的索引。
- 如果找到一个更大的 `currentSum`,则更新 `maxSum` 并记录新的子数组的起始和结束位置。

### 运行结果:
对于输入 `arr := []int{-2, 1, -3, 4, -1, 2, 1, -5, 4}`,输出将是:
```
Maximum subarray: [4 -1 2 1]
Maximum sum: 6
```

该代码能够处理所有情况,包括整个数组为负数。这种情况下,它将返回数组中最大的单个元素。

 

 

 

 map优化

时间复杂度: 时间复杂度为O(mn),其中为中元素的个数,为要兑换的总金额。

空间复杂度: 空间复杂度为O(n),为要兑换的总金额。

 

链接: https://www.ldtiger.com/pages/289b40/#c-%E4%BB%A3%E7%A0%81

 

 

我们先来分析看看: 想到对数的效率,首先想到的就是二分查找,对于这个题目二分查找的意义在哪里呢?

n和m分别表示两个数组的长度

a、如果A[n/2] == B[m/2],那么很显然,我们的讨论结束了。A[n/2]就已经是中位数,这个和他们各自的长度是奇数或者偶数无关。
b、如果A[n/2]  <   B[m/2],那么,我们可以知道这个中位数肯定不在[A[0]---A[n/2])这个区间内,同时也不在[B[m/2]---B[m]]这个区间里面。这个时候,我们不能冲动地把[A[0]---A[n/2])和[B[m/2]---B[m]]全部扔掉。我们只需要把[B[m-n/2]---B[m]]和[A[0]---A[n/2])扔掉就可以了。(如图所示的红色线框),这样我们就把我们的问题成功转换成了如何在A[n/2]->A[n]这个长度为 n/2 的数组和 B[1]-B[m-n/2]这个长度为m-n/2的数组里面找中位数了,问题复杂度即可下降了。
c、只剩下A[n/2] > B[m/2],和b类似的,我们可以把A[n/2]->A[n]这块以及B[1]->B[n/2]这块扔掉了就行,然后继续递归。
我们也可以写出如下的代码


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号