小米OJ-18題-Go

小米OJ第18題Go語言實現:

問題鏈接:https://code.mi.com/problem/list/view?id=18

描述

用一個數組表示一羣正在排隊的小學生,每個小學生用一對整數 H, K 來表示:H 表示這個小學生的身高,K 表示這個小學生前面應該有 K 個人的身高 >= 他。

寫一個算法,對給出的一組小學生計算出符合描述的正確排序。

輸入

輸入爲一組整數,以空格分隔:

第 1 個數字表示小學生的數量 n;
從第 2 個數字起,後續的數字兩兩一組,分別代表每個小學生的 H 和 K 的值:H_1\text{ }K_1\text{ }H_2\text{ }K_2 \cdots H_n\text{ }K_nH1​ K1​ H2​ K2​⋯Hn​ Kn​.

輸出

根據輸入,按照題目要求對小學生進行排序,每個小學生對應的 H 和 K 值爲一組,按組輸出,數字間使用空格分隔。比如H_1'\text{ }K_1'\text{ }H_2'\text{ }K_2' \cdots H_n' \text{ }K_n'H1′​ K1′​ H2′​ K2′​⋯Hn′​ Kn′​

輸入樣例

6 7 0 4 4 7 1 5 0 6 1 5 2

package main

import (
	"bufio"
	"bytes"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
)

type Student struct {
	Height int64
	Index  int64
}

func solution18(line string) string {
	numsAll := strings.Split(line, " ")
	number, _ := strconv.Atoi(numsAll[0])
	allArray := make([]Student, number)
	resultArray := make([]Student, number)

	for i := 1; i < len(numsAll); i += 2 {
		Height, _ := strconv.Atoi(numsAll[i])
		Index, _ := strconv.Atoi(numsAll[i+1])
		student := Student{int64(Height), int64(Index)}
		allArray[i/2] = student
	}

	sort.Slice(allArray, func(i, j int) bool {
		if allArray[i].Height == allArray[j].Height {
			return allArray[i].Index < allArray[j].Index
		}
		return allArray[i].Height > allArray[j].Height
	})

	var byte bytes.Buffer
	for i := 0; i < len(allArray); i++ {
		resultArray = InsertSort(resultArray, allArray[i], allArray[i].Index)
	}

	for i := 0; i < len(resultArray); i++ {
		byte.WriteString(strconv.FormatInt(resultArray[i].Height, 10))
		byte.WriteString(" ")
		byte.WriteString(strconv.FormatInt(resultArray[i].Index, 10))
		if i!=len(resultArray)-1{
			byte.WriteString(" ")
		}
	}
	return byte.String()
}

func InsertSort(array []Student, student Student, index int64) []Student {
	if array[index].Height > 0 {
		for i := index; i < int64(len(array)); i++ {
			if array[i].Height == 0 {
				for j := i; j > index; j-- {
					array[j] = array[j-1]
				}
				array[index] = student
				return array
			}
		}
	}
	array[index] = student
	return array
}

func main() {
	r := bufio.NewReaderSize(os.Stdin, 20480)
	for line, _, err := r.ReadLine(); err == nil; line, _, err = r.ReadLine() {
		fmt.Println(solution18(string(line)))
	}
}

運行數據
注:此題在插入排序上的時間複雜度較高,可以採用鏈表,總體時間複雜度可以降爲O(nlogn),主要 花費在排序上,現在是O(n2)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章