题解 | #删除字符串中出现次数最少的字符#

删除字符串中出现次数最少的字符

https://www.nowcoder.com/practice/05182d328eb848dda7fdd5e029a56da9

package main

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

type ByteCnt struct {
    Ch byte
    Cnt int
}

func removeMinDupElement(s string) string {
    size := len(s)
    m := make(map[byte]int, 0)
    
    for i:=0; i<size; i++ {
        m[s[i]]++
    }

    var byteCntList []ByteCnt
    for k := range m {
        byteCntList = append(byteCntList, ByteCnt{k, m[k]})
    }

    // 按照频次从低到高排序
    sort.Slice(byteCntList, func(i, j int) bool {
        return byteCntList[i].Cnt < byteCntList[j].Cnt
    })

    // 如果只有一个元素,则返回空
    if len(byteCntList) == 1 {
        return ""
    }

    toBeDeleteByte := make(map[byte]struct{}, 0)
    for idx:=0; idx<len(byteCntList); idx++ {
        if idx > 0 && byteCntList[idx].Cnt != byteCntList[idx-1].Cnt {
            break
        }
        toBeDeleteByte[byteCntList[idx].Ch] = struct{}{}
    }

    var slow int
    sb := make([]byte, size)
    for fast:=0; fast<size;fast++ {
        if _, ok := toBeDeleteByte[s[fast]]; !ok {
            sb[slow] = s[fast]
            slow++
        }
    }

    return string(sb[:slow])
}

func main() {
    var s string

    inputReader := bufio.NewReader(os.Stdin)
    line, _, _ := inputReader.ReadLine()

    s = string(line)

    fmt.Println(removeMinDupElement(s))
}
// 本题输入一个字符串,故采用:inputReader.ReadLine()

全部评论

相关推荐

10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-21 19:05
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务