小红书第二题AK-区间和之和


  1. 调整数组元素顺序:小的在中间,大的在两边。两边的数用到的次数最多。
  2. 计算和,计算时两个for会超时。换思路,根据元素出现次数计算,一次for搞定。


package main

import (
	"fmt"
	"sort"
)

func main() {
	var n int
	fmt.Scan(&n)
	a := make([]int, n)
	for i := range a {
		fmt.Scan(&a[i])
	}
	sort.Sort(sort.Reverse(sort.IntSlice(a)))
	ranged := make([]int, n)
	left, right := 0, n-1
	for i := 0; i < n; i++ {
		if i%2 == 0 {
			ranged[left] = a[i]
			left++
		} else {
			ranged[right] = a[i]
			right--
		}
	}
	result := 0
	left, right = 0, n-1
	count := 1
	for left <= right {
		result += ranged[left] * n * count
		if left != right {
			result += ranged[right] * n * count
		}
		n--
		count++
		left++
		right--
	}
	fmt.Println(result)
}

#小红书笔试#
全部评论

相关推荐

2 1 评论
分享
牛客网
牛客企业服务