华为机试JavaScript 字符串按次数降序排列;次数相同,按单词长度升序;排列次数和单词长度均相同,按字典升序排列

该文章描述了一个华为机试题目,要求对输入字符串进行处理,包括单词内部字母排序和单词间的统计排序。首先按单词出现次数降序排列,次数相同则按单词长度升序,长度再相同按字典序升序。解决方案使用JavaScript实现,包括统计、排序和分组等步骤。
摘要由CSDN通过智能技术生成

华为机试练习:

题目要求


1. 给定一个字符串s,s包括以空格分隔的若干个单词,请对s进行如下处理后输出:单词内部调整:对每个单词字母重新按 字典序排序
2、单词间顺序调整:
    1)  统计每个单词出现的次数,并按次数 降序排列
    2) 次数相同,按单词长度 升序排列
    3) 次数和单词长度均相同,按字典升序排列 

=============================
请输出处理后的字符串,每个单词以一个空格分隔。
输入描述:
              行字符串,每个字符取值范围: [a-ZA-Z0-9] 以及空格,字符串长度范围:[1,1000]
 ===================================
测试字符串语句:

输入:

'My sister is in the house not in the yard I am not not'

最终输出:

 思路:

 先统计出现次数,再排序。 排序完成之后,按同次数的再分组,分组的数据再按单词长度及字典顺序排序。

实现JS源码:

let ss = 'My sister is in the house not in the yard I am not not'
let slist = ss.trim().split(' ')
console.log(slist)

/*
* 1. 先按统计单词出现的次数,再排序(降序)
* */

let newslist = slist.reduce((total, currentValue, currentIndex) => {
    if (total[currentValue]) {
        total[currentValue] += 1 //计数累加
    } else {
        total[currentValue] = 1
    }
    return total
}, {}) //{}初始化total={}
console.log(newslist)

//按值排序
let arr = []
for (let val in newslist) {
    arr.push({val, 'count': newslist[val]})
}

let result = arr.sort((a, b) => {
        // return a.count - b.count//出现次数升序
        return b.count - a.count//出现次数降序
    }
)
console.log("按出现次数排序结果:", result)

/*
* 2. 按出现的次数分组' [ {val: 'My', count: 1}。。。。。]
* */
function groupByTime(arr) {//
    let index = 0
    let len = 0
    let groupList = arr.reduce((groud, currentValue) => {
        if (currentValue.count == len) {
            groud[index - 1].push(currentValue)
        } else {
            let ar = []
            ar.push(currentValue)
            groud[index++] = ar
            len = currentValue.count
        }
        return groud
    }, [])
    console.log(groupList)
    return groupList
}

let groupList = groupByTime(result) //按照次数分组了。
console.log('按出现的次数分组', groupList)


//在分组里排序:先按单词的长度
function sortBySignalWordLen(arr) {
    return arr.sort((a, b) => a.length - b.length);
}

let newgroup = groupList.map((item) => item = sortBySignalWordLen(item))
console.log('>>>>先按单词的长度', newgroup)

/*
*  3. js实现数组中的字符串按长度排序,长度一样按字母顺序排序。
*      数组格式[{val: 'I', count: 1},......]
* */
function sortByLenByazAZVal(array) {
    array.sort((a, b) => {
        if (a.val.length !== b.val.length) {
            return a.val.length - b.val.length
        } else {
            return a.val.localeCompare(b.val);
        }
    })
    return array
}

console.log('>>>')
let sortByDictResult = newgroup.map((item) => sortByLenByazAZVal(item))
console.log('长度排序,长度一样按字母>>', sortByDictResult)

console.log('>>>')
/*
* 4. 最后拍平打印输出
* */

let finalAr = []
sortByDictResult.forEach((item) => {
    item.forEach((detailValue) => {
        for (let i = 0; i < detailValue.count; i++) {
            finalAr.push(detailValue.val)
        }
    })
})
console.log(finalAr.join(' '))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值