华为OD机试真题】6、数组去重和排序

 
 给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序 
 

package main

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

type intCount struct {
	key   int
	count int
}

func getIndexByValue(list []int, value int) int {
	for i, i2 := range list {
		if i2 == value {
			return i
		}
	}
	return -1

}

func main() {
	var inputStr string
	scanner := bufio.NewScanner(os.Stdin)
	if scanner.Scan() {
		inputStr = scanner.Text()
	}

	strList := strings.Split(inputStr, ",")
	intList := make([]int, len(strList))
	for i, s := range strList {
		intList[i], _ = strconv.Atoi(s)
	}

	intDistinctList := make(map[int]int)
	for _, s := range intList {
		intDistinctList[s]++
	}

	intCountList := make([]*intCount, 0)
	for c, i := range intDistinctList {
		intCountList = append(intCountList, &intCount{
			key:   c,
			count: i,
		})
	}

	sort.Slice(intCountList, func(i, j int) bool {
		if intCountList[i].count != intCountList[j].count {
			return intCountList[i].count > intCountList[j].count
		}

		return getIndexByValue(intList, intCountList[i].key) < getIndexByValue(intList, intCountList[j].key)
	})

	outputStr := ""
	for _, item := range intCountList {
		if outputStr == "" {
			outputStr = fmt.Sprintf("%d", item.key)
		} else {
			outputStr = fmt.Sprintf("%s,%d", outputStr, item.key)
		}
	}

	fmt.Println(outputStr)

}

这道题和前面做过的“字符统计及重排”类型一致,解法也相同,属于比较简单的题目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值