合并两个有序数组的golang实现

摘要:
给定两个有序整数数组nums1和nums2,将nums2组合成nums1,使num1成为有序数组。您可以假设nums1有足够的空间来存储nums2中的元素。Funcmerge{//将nums1复制到temp:=makecopy中,j:=0,0/t是temp的索引,j是nums2的索引,其中i:=0;i=len{nums1[i]=nums2[j]j++continue}//当j大于nums2的长度时,这意味着nums2全部放入nums1中,那么剩下的就是放入temp的剩余值ifj˃=n{nums1[i]=temp[t]t++continue}//比较nums2和temp的对应值的大小,并将较小的一个放入nums1 ifnums2[j]˂=temp[t]{nums1[i]=nums2[j]j++}否则{nums1[i]=temp[t]t++}fmt。打印ln}

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:
  • 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

由题目中我们可以知道其实就是把nums1的前m项和nums2的前n项合并,并放进nums1中

因为nums1要变动,所以我们拷贝nums1到一个临时变量中

    //把nums1复制到temp中
    temp := make([]int, m)
    copy(temp, nums1)

然后就是对比temp与nums2对应的值,比较哪个比较小,小的那个就插入nums1中

    t, j := 0, 0 //t为temp的索引,j为nums2的索引
    for i := 0; i < len(nums1); i++ {
        //比较nums2与temp对应值的大小,小的那个就放进nums1中
        if nums2[j] <= temp[t] {
            nums1[i] = nums2[j]
            j++
        } else {
            nums1[i] = temp[t]
            t++
        }
    }

但是这样写,总有一个会先用完,当用完的时候,索引++会导致

index out of range

所以要改进一下代码,整体代码:

// 本题的要求是,把nums1的前m项和nums2的前n项合并,放入nums1中。
func merge(nums1 []int, m int, nums2 []int, n int) {
    //把nums1复制到temp中
    temp := make([]int, m)
    copy(temp, nums1)

    t, j := 0, 0 //t为temp的索引,j为nums2的索引
    for i := 0; i < len(nums1); i++ {
        //当t大于temp的长度,那就是说temp全部放进去了nums1中,那剩下的就是放nums2剩余的值了
        if t >= len(temp) {
            nums1[i] = nums2[j]
            j++
            continue
        }
        //当j大于nums2的长度的时候,那就是说明nums2全部都放进去了nums1中,那剩下的就是放temp剩余的值了
        if j >= n {
            nums1[i] = temp[t]
            t++
            continue
        }
        //比较nums2与temp对应值的大小,小的那个就放进nums1中
        if nums2[j] <= temp[t] {
            nums1[i] = nums2[j]
            j++
        } else {
            nums1[i] = temp[t]
            t++
        }
    }
    fmt.Println(nums1)
}

免责声明:文章转载自《合并两个有序数组的golang实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇c# 后台隐式使用webBrowser[Word] Word中保存出矢量图下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Golang ECHO中间件【10】

在echo框架中中间件(Middleware)指的是可以拦截http请求-响应生命周期的特殊函数,在请求-响应生命周期中可以注册多个中间件,每个中间件执行不同的功能,一个中间执行完再轮到下一个中间件执行。 中间件是一个函数,嵌入在HTTP 的请求和响应之间。它可以获得 Echo#Context 对象用来进行一些特殊的操作, 比如记录每个请求或者统计请求数。...

Python与Golang协程异同

背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容。 进程的定义: 进程,是计算机中已运行程序的实体。程序本身只是指令、数据及其组织形式的描述,进程才是程序的真正运行实例。 线程的定义: 操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 进程和线程的关系: 一条线程指的是进程中一个单一顺序的控制流,一个进程...

golang 服务平滑重启小结

背景 golang 程序平滑重启框架 supervisor 出现 defunct 原因 使用 master/worker 模式 背景 在业务快速增长中,前期只是验证模式是否可行,初期忽略程序发布重启带来的暂短停机影响。当模式实验成熟之后会逐渐放量,此时我们的发布停机带来的影响就会大很多。我们整个服务都是基于云,请求流量从 四层->七层->...

golang垃圾回收机制

golang的GC,1.8通过混合写⼊屏障, 使得STW降到了sub ms。go语言中程序代码执行和垃圾回收是并发执行的。 当前Go GC特征 :三色标记,并发标记和清扫,非分代,非紧缩,混合写屏障。三色标记:1. 将所有对象放在白色集合中2. 从rootset遍历可达对象,将可达对象放在灰色集合中3. 将灰色集合中对象进行遍历,将可达对象放在灰色集合中,...

golang查找端口号占用的进程号

golang官方包: https://studygolang.com/pkgdoc os 支持获取当前进程pid并kill、但是仅仅限于获取当前进程pid FindProcess().Kill() os.Getpid() 基础用法;但是却没有提供依据端口号获取对应的pid,所以还是执行shell指令对结果集进行过滤获取pid // 获取8299端口对应进程...

Golang基础编程(四)-Map(集合)、Slice(切片)、Range

一、Map ·Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。 ·Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。 Map-声明&初始化 Map使用前必须初始化 Ma...