在一個(gè)字符串?dāng)?shù)組中有紅、黃、藍(lán)三種顏色的球,且個(gè)數(shù)不相等、順序不一致,請(qǐng)為該數(shù)組排序。使得排序后數(shù)組中球的順序?yàn)?黃、紅、藍(lán)。
例如:紅藍(lán)藍(lán)黃紅黃藍(lán)紅紅黃紅,排序后為:黃黃黃紅紅紅紅紅藍(lán)藍(lán)藍(lán)。
//方法一:遍歷取每個(gè)球的個(gè)數(shù),用對(duì)象value保存,輸出新遍歷字符串
var str = '紅藍(lán)藍(lán)黃紅黃藍(lán)紅紅黃紅'
function sortBalls(str){
var obj = {'黃':0,'紅':0,'藍(lán)':0},res='';
for(let i=0,length = str.length;i<length;i++){
obj[str.charAt(i)]++
}
for(let key in obj){
var str="";
for(var j=0;j<obj[key];j++){
res+=key
}
}
return res
}
sortBalls(str)
//方法2:涉及排序就可聯(lián)想到sort,但sort使用整數(shù),如果為字符會(huì)轉(zhuǎn)為unicode編碼,可用顏色為key,代號(hào)為value,value為數(shù)字
function sortBalls(str){
var obj={'黃':0,'紅':1,'藍(lán)':2};
return str.split('').sort((a,b)=>{return obj[a]-obj[b]}).join('');
}
//方法3:創(chuàng)建對(duì)應(yīng)種類(lèi)個(gè)數(shù)數(shù)組,分別push.合并
function sortBalls(str){
// or Array.from({length:3}.fill([]),[[],[],[]];
var arr = Array.from({length:3},item=>item=[]);
//創(chuàng)建hash表,按排序順序設(shè)置value
var hashObj = {'黃':0,'紅':1,'藍(lán)':2};
//遍歷字符將元素放入對(duì)應(yīng)下標(biāo)子數(shù)組
for(var i=0,length=str.length;i<length;i++){
var item=str.charAt(i);
arr[hashObj[item]].push(item);
}
return arr.reduce((pre,cur)=>pre+=cur.join(''),'')
}
//方法四:用str的matchAll,matchAll為ES新增加API,返回不可重啟的迭代器RegExpStringIterator {},需用...orArray.from轉(zhuǎn)為數(shù)組可觀察
function sortBall(str){
return ['黃','紅','藍(lán)'].map((o)=>o.repeat([...'紅藍(lán)藍(lán)黃紅黃藍(lán)紅紅黃紅'.matchAll(o)].length)).join('')
}
引申:可聯(lián)想到常用快排或者歸并排序方式實(shí)現(xiàn)