算法-每天一道题(25)-翻转数组-slice

给定一个长度为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切片的修改操作

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部