数据排序_麦克机试
题目
假设有如下字符串“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],''))
}
小子前端小白一个,欢迎各位大佬指点