给定一个长度为n的整数数组a,元素均不相同,问数组是否存在这样一个片段,只将该片段翻转就可以使整个数组升序排列。其中数组片段[l,r]表示序列a[l], a[l+1], …, a[r]。原始数组为
a[1], a[2], …, a[l-2], a[l-1], a[l], a[l+1], …, a[r-1], a[r], a[r+1], a[r+2], …, a[n-1], a[n],
将片段[l,r]反序后的数组是
a[1], a[2], …, a[l-2], a[l-1], a[r], a[r-1], …, a[l+1], a[l], a[r+1], a[r+2], …, a[n-1], a[n]。输入
第一行数据是一个整数:n (1≤n≤105),表示数组长度。
第二行数据是n个整数a[1], a[2], …, a[n] (1≤a[i]≤109)。
输出
输出“yes”,如果存在;否则输出“no”,不用输出引号。
样例输入
4
2 1 3 4
样例输出
yes
package main
import (
“fmt”
)
func main() {
var length int
fmt.Scanln(&length)
var arr = make([]int, length)
for i := 0; i < length; i++ {
fmt.Scanf("%d", &arr[i])
}
var before_arr = make([]int, 1, length)
var after_arr = make([]int, 0, length)
var aim_arr = make([]int, 0, length)
before_arr[0] = arr[0]
var changed bool
var not_append bool
for i := 1; i < length; i++ {
if before_arr[len(before_arr)-1] > arr[i] && !not_append {
aim_arr = append(aim_arr, arr[i])
changed = true
} else {
if changed {
after_arr = append(after_arr, arr[i])
not_append = true
continue
}
before_arr = append(before_arr, arr[i])
}
}
var change_result bool
for i := 0; i < len(before_arr); i++ {
temp_after := insert(before_arr, aim_arr, i)
temp := complete(temp_after, after_arr)
if change_result = check(temp); change_result {
break;
}
}
if change_result {
fmt.Println("yes")
} else {
fmt.Println("no")
}
}
// 向slice中插入
func insert(slice, insertion []int, index int) []int {
result := make([]int, len(slice)+len(insertion))
at := copy(result, slice[:index])
at += copy(result[at:], insertion)
copy(result[at:], slice[index:])
return result
}
// 拼接两个slice
func complete(before, after []int) []int {
result := make([]int, len(before)+len(after))
at := copy(result, before[:])
copy(result[at:], after[:])
return result
}
// 检查slice是否满足规定
func check(slice []int) bool {
for i := 1; i < len(slice); i++ {
if slice[i] < slice[i-1] {
return false
}
}
return true
}
[/go]
参考链接:Golang中slice切片的修改操作