資料排序_麥克機試

前端小李子發表於2024-06-22

題目

假設有如下字串“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],''))
    }

小子前端小白一個,歡迎各位大佬指點

相關文章