
2026-06-07:合并相邻且相等的元素。用go语言,给你一个整数数组 nums。你要反复做合并,直到再也找不到可以合并的相邻相等元素为止。
规则是:在当前数组里,只要存在某两个相邻位置上的值相同,就可以进行合并。每次操作时,要优先挑选“最靠左”的那一对相邻相等元素,把这两个数用它们的和替换掉。完成一次合并后,数组长度会减少 1,然后继续在新数组上寻找相邻相等的最左那一对,重复此过程,直到无法再合并。
最终,返回合并完成后的数组。
1 <= nums.length <= 100000。
1 <= nums[i] <= 100000。
输入: nums = [3,1,1,2]。
输出: [3,4]。
解释:
中间的两个元素相等,将它们合并为 1 + 1 = 2,结果为 [3, 2, 2]。
最后的两个元素相等,将它们合并为 2 + 2 = 4,结果为 [3, 4]。
不再存在相邻且相等的元素。因此,答案为 [3, 4]。
题目来自力扣3834。
原始数组:[3, 1, 1, 2]
长度:4
当前无任何合并操作,开始第一次查找。
3和第2个元素1:不相等,跳过;1和第3个元素1:相等,这是当前最左侧的可合并对。1相加 = 2,替换这两个元素;[3, 2, 2]
长度变为:3合并后必须从头开始检查新数组:
3和第2个元素2:不相等,跳过;2和第3个元素2:相等,这是当前最左侧的可合并对。2相加 = 4,替换这两个元素;[3, 4]
长度变为:2检查最终数组 [3, 4]:
唯一一对相邻元素3和4不相等,没有可合并的元素,合并流程结束。
合并完成后的数组:[3, 4]
代码用了**栈(切片模拟栈)**的高效思路,替代了「反复遍历数组」的低效方式,完美匹配题目规则:
这个逻辑**自动实现了「优先合并最左侧」**的规则,且无需反复遍历数组。
n 是输入数组的长度;10^5,也能高效运行。st := nums[:0]),没有创建新的大容量切片;1+1=2得到[3,2,2],再合并2+2=4得到最终结果[3,4];.
package main
import (
"fmt"
"unsafe"
)
func mergeAdjacent(nums []int) []int64 {
st := nums[:0] // 原地
for _, x := range nums {
forlen(st) > 0 && st[len(st)-1] == x {
st = st[:len(st)-1]
x *= 2
}
st = append(st, x)
}
// 力扣的 int 就是 int64,直接 O(1) 转成 []int64
return *(*[]int64)(unsafe.Pointer(&st))
}
func main() {
nums := []int{3, 1, 1, 2}
result := mergeAdjacent(nums)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
from typing import List
def merge_adjacent(nums: List[int]) -> List[int]:
"""
原地合并相邻的相同数字(类似 2048 游戏规则)
将相邻且相同的数字合并为它们的和(乘以2)
"""
st = [] # 使用列表作为栈
for x in nums:
# 当栈不为空且栈顶元素等于当前元素时,进行合并
while st and st[-1] == x:
st.pop() # 移除栈顶元素
x *= 2 # 当前元素翻倍
st.append(x)
return st
def main():
nums = [3, 1, 1, 2]
result = merge_adjacent(nums)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <vector>
#include <cstdint>
using namespace std;
vector<int64_t> mergeAdjacent(vector<int>& nums) {
// 原地操作:使用 nums 的前部作为栈空间
size_t stackSize = 0; // 栈的大小
for (int x : nums) {
// 当栈不为空且栈顶元素等于当前元素时,进行合并
while (stackSize > 0 && nums[stackSize - 1] == x) {
stackSize--; // 弹出栈顶
x *= 2; // 当前元素翻倍
}
// 将当前元素放入栈中
nums[stackSize] = x;
stackSize++;
}
// 将结果转换为 int64_t 类型的 vector
vector<int64_t> result;
result.reserve(stackSize);
for (size_t i = 0; i < stackSize; i++) {
result.push_back(nums[i]);
}
return result;
}
int main() {
vector<int> nums = {3, 1, 1, 2};
vector<int64_t> result = mergeAdjacent(nums);
cout << "[";
for (size_t i = 0; i < result.size(); i++) {
if (i > 0) cout << " ";
cout << result[i];
}
cout << "]" << endl;
return0;
}

·
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。