华为机试练习:
题目要求
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(' '))