ARTS 第20周

2019-08-19  本文已影响0人  陈卧虫

ARTS 第20周分享

[TOC]

Algorithm

164. Maximum Gap

[hard]
[题目描述]

Given an unsorted array, find the maximum difference between the successive elements in its sorted form.

Return 0 if the array contains less than 2 elements.

Example 1:
Input: [3,6,9,1]
Output: 3
Explanation: The sorted form of the array is [1,3,6,9], either
             (3,6) or (6,9) has the maximum difference 3.
[解题思路]
[参考代码]
func maximumGap(nums []int) int {
    // 排除少于两个元素的情况
    if len(nums) < 2 {
        return 0
    }

    // 先将数组排序,基数排序(线性时间复杂度)
    radixSort(nums)
    // 然后遍历整个数组相邻的元素,记录最大的Gap
    gap := 0
    for i:=1; i<len(nums); i++ {
        tmpGap := nums[i]-nums[i-1]
        if tmpGap > gap {
            gap = tmpGap
        }
    }
    return gap
}

func radixSort(array []int) {
    // 桶排序的一个升级版,新建10个0-9的桶,将数组中的所有元素按照个位数分别放入到桶中
    // 然后再依次从桶中取出放回原数组。
    // 重复以上步骤,只是将个位改成十位,百位,知道最高位。

    // 创建桶
    bucketCount := 10
    bucket := make([][]int, bucketCount)
    for i := 0; i < bucketCount; i++ {
        bucket[i] = make([]int, 0)
    }

    // 找出数组中的最大数,从而确定基数
    radix := 0
    for _, v := range array {
        if radix < v {
            radix = v
        }
    }
    radixLen := len(strconv.Itoa(radix))
    bit := 1
    for round:= 0; round<radixLen; round++ {
        // 将数组中的所有元素按照个位数分别放入到桶中

        for _, v := range array {
            bucNum := v / bit % 10
            bucket[bucNum] = append(bucket[bucNum], v)
        }
        bit *= 10

        // 然后再依次从桶中取出放回原数组。
        index := 0
        for num := 0; num < bucketCount; num++ {
            for _, v := range bucket[num] {
                array[index] = v
                index++
            }
        }

        // 将桶内元素清空
        for i := 0; i < bucketCount; i++ {
            bucket[i] = make([]int, 0)
        }
    }
}

179. Largest Number

[medium]
[题目描述]

Given a list of non negative integers, arrange them such that they form the largest number.

Example 1:

Input: [3,30,34,5,9]
Output: "9534330"
[解题思路]
[参考代码]
func largestNumber(nums []int) (res string) {
    // 将数组排序
    // 1. 将[]int 转成 []string
    var numsStr numsStr
    for i:=0; i<len(nums); i++ {
        numsStr = append(numsStr, strconv.Itoa(nums[i]))
    }

    // 2. 将数组排序
    sort.Sort(numsStr)

    // 拼接
    for i:=0; i<len(numsStr); i++ {
        res += numsStr[i]
    }
    if res[0] == '0' {
        return "0"
    }
    return
}

type numsStr []string

func (ns numsStr) Len() int {
    return len(ns)
}

func (ns numsStr) Less(i, j int) bool {
    a, b := ns[i]+ns[j], ns[j]+ns[i]
    for i := 0; i < len(a); i++ {
        if a[i] > b[i] {
            return true
        } else if a[i] < b[i] {
            return false
        }
    }
    return false
}

func (ns numsStr) Swap(i, j int) {
    ns[i], ns[j] = ns[j], ns[i]
}

Review

golang Mutex : https://golangbot.com/mutex/

Tips

str := "abcd"
if str[0] == "a" {
    // do something
}

原因是你不能拿一个byte类型的值与[]byte 做对比。

所以就需要用一种到单引号'a' : str[0] == 'a'

share

本周阅读

第二周:1, 4, 5, 7
三星的区块链野心:qshttps://mp.weixin.qq.com/s/wLMFWGXzsZLTW9pDXhkshQ
漫话:如何给女朋友解释鸿蒙OS是怎样实现跨平台的?https://mp.weixin.qq.com/s/spcJhT-Vvew3RtSQUuoeQg

新版本Golang的包管理入门教程: https://juejin.im/post/5c9c8c4fe51d450bc9547ba1

如何优雅地关闭Go channel: https://mp.weixin.qq.com/s/TtiaTA5bDqpAz2VihmI3eg

golang mutex: https://golangbot.com/mutex/
上一篇下一篇

猜你喜欢

热点阅读