題目
假設有如下字串“A12”,其中“A”表示資料型別(A-Z),“12”表示資料序號(0-9)。現在需要對一組資料先按照資料序號再按照資料型別進行排序。
例如:["B3","D2","F1","A9","D12","A2","C1","Z0","B1"]=>["Z0","B1","C1","F1","A2","D2","B3","A9","D12"]
我的思路
我們從這個陣列就可以看出=>["Z0","B1","C1","F1","A2","D2","B3","A9","D12"],它是一個英文字母+數字的組合,
如果先看英文字母的話,是亂的,看不明白。
所以我選擇先看數字,這一看,啊,升序排序,明白了。
這個時候再觀察英文字母的規律,是在數字順序不變的情況下,讓英文字母按A-Z的順序排列。
那麼看明白了就好解決了塞,就是兩個排序嘛。
我先是寫了一個取出陣列每一項中數字的方法:
//將字串中的數字取出
function getNum(value){
return parseInt(value.replace(value.split('')[0],''))
}
然後寫了一個方法對數字排序:
//將陣列按數字排列
function utilOne(arr){
for(let i = 0;i< arr.length - 1;i++){
for(let j = i + 1;j < arr.length;j++){
let a = getNum(arr[i])
let b = getNum(arr[j])
if(a > b){
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
}
}
return arr
}
最後是在數字順序不變的情況下調整字母的順序,我們可以比較字母的unicode碼,[A~Z] =>[65,90],我們可以用字串的方法 charCodeAt() 獲取字母的unicode,再根據unicode進行排序。要從unicode轉回字母可以用fromCharCode()
//在數字相同的時候 把數字型別升序排列
function utilTwo(arr){
for(let i = 0;i< arr.length - 1;i++){
for(let j = i + 1;j < arr.length;j++){
let a = arr[i].split('')[0]
let b = arr[j].split('')[0]
let aCode = parseInt(a.charCodeAt(0))
let bCode = parseInt(b.charCodeAt(0))
let aNum = getNum(arr[i])
let bNUm = getNum(arr[j])
// 在數字相同的時候 把數字型別升序排列
if(aCode > bCode && aNum === bNUm){
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
}
}
return arr
}
我寫的是charCodeAt(0),後來我寫部落格的時候才發現,charCodeAt(index),index的意思是獲取第幾個的unicode碼,字串可以不用分隔
'A'.charCodeAt() == 'A'.charCodeAt(0) == 'A121212'.charCodeAt(0) == '1A12'.charCodeAt(1)
以上就是我本人對這道題的思路以及解答,下面是原始碼
let arr = ["B3","D2","F1","A9","D12","A2","C1","Z0","B1"]
//先將陣列按數字排列
let arrOne = utilOne(arr)
// 再將陣列按數字型別排列
let result = utilTwo(arrOne)
console.log(result)
//將陣列按數字排列
function utilOne(arr){
for(let i = 0;i< arr.length - 1;i++){
for(let j = i + 1;j < arr.length;j++){
let a = getNum(arr[i])
let b = getNum(arr[j])
if(a > b){
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
}
}
return arr
}
//在數字相同的時候 把數字型別升序排列
function utilTwo(arr){
for(let i = 0;i< arr.length - 1;i++){
for(let j = i + 1;j < arr.length;j++){
let a = arr[i].split('')[0]
let b = arr[j].split('')[0]
let aCode = parseInt(a.charCodeAt(0))
let bCode = parseInt(b.charCodeAt(0))
let aNum = getNum(arr[i])
let bNUm = getNum(arr[j])
// 在數字相同的時候 把數字型別升序排列
if(aCode > bCode && aNum === bNUm){
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
}
}
return arr
}
//將字串中的數字取出
function getNum(value){
return parseInt(value.replace(value.split('')[0],''))
}
小子前端小白一個,歡迎各位大佬指點