【go】剑指offer:不同程序员遇到相同的题

不忘初心,砥砺前行 

作者 | 陌无崖

转载请联系授权 

题目要求

调整数组位置,使得数组顺序为奇数到偶数

题目分析

该题可以说是初级程序员的水平,然而却有很多程序员的解决思路并不是完美。现在一起看看不同程序员的解决思路吧~

初级程序员

这道题很简单,只需要遍历数组,判断每一个数字的奇数偶数的性质即可,因此需要准备两个临时数组用来存储,然后再合并即可。

func ReOrderOddEven(data []int) []int {
    if len(data) == 0{
        return data
    }
    var temp1 []int
    var temp2 []int
    lengh := len(data)
    for i := 0; i < lengh; i++ {
        if data[i]&1 == 1 {
            temp1 = append(temp1, data[i])
        } else {
            temp2 = append(temp2, data[i])
        }
    }
    var result []int
    for i := 0; i < len(temp1); i++ {
        result = append(result, temp1[i])
    }
    for i := 0; i < len(temp2); i++ {
        result = append(result, temp2[i])
    }
    return result
}

中级程序员

这道题很简单,但一般考察这道题不会用那么明显的思路,会不会有更好的思路呢?于是该程序员想到了用两个指针,分别指向头和尾,那么思路就显而易见了

1、如果前指针和后指针指向的数组分别是一个偶数一个奇数,就进行交换位置
2、如果前后一奇数一偶数,则不需要变动,移动指针
3、如果两个都是奇数,只需要移动前指针找到偶数进行交换即可

func ReOrderOddEven_two(data []int) []int {
    // 定义头尾指针
    i, j := 0, len(data)-1
    for i <= j {
        if data[i]&1 == 0 && data[j]&1 == 1 {
            data[i], data[j] = data[j], data[i]
            i++
            j--
        } else if data[i]&1 == 1 && data[j]&1 == 1 {
            i++
        } else if data[i]&1 == 0 && data[j]&1 == 0 {
            j--
        } else {
            i++
            j--
        }

    }
    return data
}

高级程序员

这道题过于简单,是否可以进行优化和扩展呢?假如我希望将负数排列在前面,正数排列在后面呢?只需要改动for循环中的判断条件,假如我需要将被3整除的放左,其余的放在右边呢?仍然需要改动for循环中的判断,很快,该程序员想到了模板,既然只需要改动部分代码,其实可以将需要改动的写成一个函数,下次想要扩展什么功能,也仅仅需要添加一个小函数,如下,假如仍然需要将奇数排列在前,偶数排列在后,那么我们就可以有这样的函数

func JudgeOddAndEven(data int) bool {
    if data&1 == 1 {
        return true
    }
    return false
}

而我们的模板函数就变成了

type F func(int) bool

func ReOrderOddEven_four(data []int, f F) []int {
    if len(data) <= 0 {
        return data
    }
    i, j := 0, len(data)-1
    for i <= j {
        for f(data[i]) && i <= j {
            i++
        }
        for !f(data[j]) && i <= j {
            j--
        }
        if i <= j {
            data[i], data[j] = data[j], data[i]
        }

    }
    return data
}

查看完整源码可以点击阅读原文进入github仓库,如果喜欢,感谢你为我点一个星星^_^


END

今日推荐阅读

RabbitMQ系列笔记广播模式和路由模式 
RabbitMQ系列笔记入门篇

RabbitMQ系列笔记work模式

RabbitMQ系列笔记work模式

protoc语法详解及结合grpc定义服务

Golang中Model的使用

基于Nginx和Consul构建高可用及自动发现的Docker服务架构

▼关注我,一起成长

    主要分享 学习心得、笔记、随笔▼

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值