小米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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值