尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

华为OD面试手撕真题 【合并相邻且相等的元素】多语言题解

华为OD面试手撕真题 【合并相邻且相等的元素】多语言题解 题目描述给你一个整数数组nums。你需要重复执行以下合并操作直到无法再进行任何更改如果数组中存在两个相邻且相等的元素选择当前数组中最左侧的这对相邻元素并用它们的和替换它们。每次合并操作后数组的大小减少1。对更新后的数组重复此过程直到无法再进行任何操作。返回完成所有可能的合并操作后的最终数组。示例1输入nums [3,1,1,2]输出[3,4]解释中间的两个元素相等将它们合并为1 1 2结果为[3, 2, 2]。最后的两个元素相等将它们合并为2 2 4结果为[3, 4]。不再存在相邻且相等的元素。因此答案为[3, 4]。示例2输入nums [2,2,4]输出[8]解释前两个元素相等将它们合并为2 2 4结果为[4, 4]。前两个元素相等将它们合并为4 4 8结果为[8]。示例3输入nums [3,7,5]输出[3,7,5]解释数组中没有相邻且相等的元素因此不执行任何操作。提示1 nums.length 1051 nums[i] 105题解力扣原题链接思路栈模拟题目要求相邻两个元素相同情况下用它们和用和替代它们。并且新元素与左侧最近元素相等的话会继续执行合并合并操作。这种合并场景非常适合使用栈进行处理。处理逻辑如下从前往后遍历数组当前要插入的数为num nums[i],进行如下处理判断num是否等于栈顶元素如果执行合并操作弹出栈顶元素 num 2 * num两个数的和。递归循环执行此操作num不能与左侧元素发生合并插入栈顶结束。通过2的操作模拟栈中保留元素 既为合并操作后保留的元素。将栈中元素弹出使用数组保存即可。栈的特性是先进后出转换为数组保存注意进行顺序反转cclass Solution { public: vectorlong long mergeAdjacent(vectorint nums) { vectorlong long res; stacklong long stk; int n nums.size(); for (int i 0; i n; i) { // 当前要插入的值 long long num nums[i]; // 递归合并 while (!stk.empty() stk.top() num) { stk.pop(); num * 2; } stk.push(num); } // 递归弹出栈中数组元素 while (!stk.empty()) { res.push_back(stk.top()); stk.pop(); } // 反转保证正确顺序 reverse(res.begin(), res.end()); return res; } };JAVAclass Solution { public ListLong mergeAdjacent(int[] nums) { // 使用数组模拟栈 long[] stk new long[nums.length]; int top 0; for (int i 0; i nums.length; i) { // 当前要插入的值 long num nums[i]; // 递归合并 while (top 0 stk[top - 1] num) { num * 2; top--; } stk[top] num; } // 递归弹出栈中数组元素 ListLong res new ArrayList(); for (int i 0; i top; i) { res.add(stk[i]); } return res; } }PythonclassSolution:defmergeAdjacent(self,nums):stk[]fornuminnums:# 当前要插入的值numint(num)# 递归合并whilestkandstk[-1]num:stk.pop()num*2stk.append(num)# 递归弹出栈中数组元素res[]whilestk:res.append(stk.pop())# 反转保证正确顺序res.reverse()returnresJavaScript/** * param {number[]} nums * return {number[]} */varmergeAdjacentfunction(nums){conststk[];for(leti0;inums.length;i){// 当前要插入的值letnumnums[i];// 递归合并while(stk.length0stk[stk.length-1]num){stk.pop();num*2;}stk.push(num);}// 递归弹出栈中数组元素constres[];while(stk.length0){res.push(stk.pop());}// 反转保证正确顺序res.reverse();returnres;};GofuncmergeAdjacent(nums[]int)[]int64{stk:make([]int64,0,len(nums))for_,x:rangenums{// 当前要插入的值num:int64(x)// 递归合并forlen(stk)0stk[len(stk)-1]num{stkstk[:len(stk)-1]num*2}stkappend(stk,num)}// 递归弹出栈中数组元素res:make([]int64,0,len(stk))forlen(stk)0{resappend(res,stk[len(stk)-1])stkstk[:len(stk)-1]}// 反转保证正确顺序fori,j:0,len(res)-1;ij;i,ji1,j-1{res[i],res[j]res[j],res[i]}returnres}C语言/** * Note: The returned array must be malloced, assume caller calls free(). */longlong*mergeAdjacent(int*nums,intnumsSize,int*returnSize){longlong*stk(longlong*)malloc(sizeof(longlong)*numsSize);inttop0;for(inti0;inumsSize;i){// 当前要插入的值longlongnumnums[i];// 递归合并while(top0stk[top-1]num){top--;num*2;}stk[top]num;}// 递归弹出栈中数组元素longlong*res(longlong*)malloc(sizeof(longlong)*top);intsizetop;for(inti0;isize;i){res[i]stk[top-1];top--;}// 反转保证正确顺序for(inti0,jsize-1;ij;i,j--){longlongtempres[i];res[i]res[j];res[j]temp;}free(stk);*returnSizesize;returnres;}
返回列表