前言
又是加班的晚上,项目组的同事全走完了,7点多终于弄完了今天的任务,终于有时间可以整理最近自己感兴趣的东西了,上次面试的一个题目,现场敲代码,限定时间内多种方法实现字符串的排序
题目
輸入字符串:abkgqacdBACQ 輸出:aAbBcCdgkqQ
思路与实现代码
思路一:
copilot 提供的,用js内置的localeComponent(),这是代码量最少的, 参考API:'wangdoc.com/javascript'
const str = "abkgqacdBACQ"
const strArr = str.split("")
strArr.sort((a, b) => {
return a.localeCompare(b)
})
console.log(strArr.join(''))
思路二
弄一个顺序表,然后sort方法里面返回 顺序表数组.indexof
const input = "abkgqacdBACQ"
function createAtoZArray() {
const azArray = []
for (let i = 0; i < 26; i++) {
azArray.push(String.fromCharCode(97 + i))
}
return azArray
}
const azArray = createAtoZArray()
const combineArray = []
azArray.forEach((item, index) => {
combineArray.push(item)
combineArray.push(item.toUpperCase())
})
console.log(combineArray)
const inputArr = input.split('')
inputArr.sort((a, b) => {
return combineArray.indexOf(a) - combineArray.indexOf(b)
})
const result = inputArr.join('')
console.log(result)
思路三
我将这个题目发到平时交流学习的vue技术群里面,里面的大佬们很快就帮我写出了两套解决方案,这是一个叫雪佬的大佬的
const rowString = 'abkgqacdBACQ'
const map = Object.fromEntries(rowString.split('').map(char => [char, true]))
const newStringList = []
Array.from({length: 26}).forEach((_,i)=>{
let lower = String.fromCharCode(97+i)
if (map[lower]) {
newStringList.push(lower)
}
if (map[lower.toUpperCase()]) {
newStringList.push(lower.toUpperCase())
}
})
console.log(newStringList.join(''))
思路四
这是一个叫Mars大佬的, 先知道a和A的code值,还有他们之间的差值,然后分割成数组,sort的时候判断一下,如果 比A大的就转化成小写的值+0.5,其占用空间也小,只有一个对应数组
const rowString = 'abkgqacdBACO'
let ACode = "a".charCodeAt()
let arr = rowString.split('').sort((item1, item2) => {
let item1Code = item1.charCodeAt()
let item2Code = item2.charCodeAt()
item1Code = item1Code < ACode ? item1Code + 32 + 0.5 : item1Code
item2Code = item2Code < ACode ? item2Code + 32 + 0.5 : item2Code
return item1Code - item2Code
})
console.log(arr.join(''))
总结
终于搞完啦,一抬头,9.30了都,办公室居然一个人都没有了。 要是大家有更好的方法可以评论给我,我多学习一些。