脉脉上看到有人发的笔试算法,最近在学习go语言,心血来潮就用go语言实现了一下
算法思路:
- 遍历数组,标记第一个负数的位置
- 往后遍历碰到第一个正数,就把正数往左边移动
源码如下:
package main
import (
"fmt"
)
func main() {
var list []int = []int{1, 2, 3, -2, -4, 5, 3, -2, 4, 1, -5, 3}
list = sepa(list)
fmt.Printf("%v",list)
}
//正数在左边,负数在右边
func sepa(list []int) []int {
firstNegative := -1
for key, val := range list {
if val < 0 {
if (firstNegative == -1) {
firstNegative = key
}
continue
} else if val > 0 {
if firstNegative > 0 {
for j := key ; j > firstNegative; j-- {
t := list[j]
list[j] = list[j-1]
list[j-1] = t
}
firstNegative++
}
}
}
return list
}
得到结果:[1 2 3 5 3 4 1 3 -2 -4 -2 -5]