Open bibi7 opened 5 years ago
其实第一眼看到这个题目的时候,大概是想用code码来做的,因为我依稀记得charCodeAt的用法,于是有如下东西:
charCodeAt
function concatArray(arr1, arr2) { arr2.forEach((item, index) => { let currentIndex = 0; while (arr1[currentIndex]) { if (item.charCodeAt() < arr1[currentIndex].charCodeAt()) { arr1.splice(currentIndex, 0, item); break } currentIndex++ } }) return arr1 }
从逻辑上看,判断下一个code码大于本次插入的code,则插入。但是细想后发现其实有点问题,因为当数组遍历到最后一位的时候,判定条件已经是超了边界的:
concatArray(['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'], ['A', 'B', 'C', 'D']) ["A1", "A2", "A", "B1", "B2", "B", "C1", "C2", "C", "D1", "D2"]
那可以换种思路嘛,从后一位判定会超出判定边界的话,那么可以从前面来判定:
function concatArray(arr1, arr2) { arr2.forEach((item, index) => { let currentIndex = 0; let strIndex = 0; while (arr1[currentIndex]) { if (arr1[currentIndex].indexOf(item) !== -1) { strIndex = currentIndex } currentIndex++ } arr1.splice(strIndex + 1, 0, item) }) return arr1 }
看了一圈大佬的答案,发现还是有很多值得借鉴的地方,继续总结一些其他解法。
function concatArray(arr1, arr2) { let currentItem = arr2.shift(); while (currentItem) { let currentIndex = 0; for (let i = 0; i < arr1.length; i++) { if (arr1[i].startsWith(currentItem)) { currentIndex = i; } } arr1.splice(currentIndex + 1, 0, currentItem) currentItem = arr2.shift() } return arr1 }
const arr1 = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2']; const arr2 = ['A', 'B', 'C', 'D']; function concatArray(arr1, arr2) { let result = arr2.map(item => { const filterArray = arr1.filter(val => val.startsWith(item)) return [...filterArray, item] }) return [].concat(...result) } concatArray(arr1, arr2)
function concatArray(arr1, arr2) { const array = arr2.map(item => item + '3') const result = [...arr1, ...array].sort().map(item => { if (item.indexOf('3') !== -1) { return item.split('')[0] } return item }) return result }
let arr1 = ["A1", "A2", "B1", "B2", "C1", "C2", "D1", "D2"]; let arr2 = ["A", "B", "C", "D"]; console.log( [...arr1, ...arr2] .sort( (v2, v1) => ( v2.codePointAt(0) - v1.codePointAt(0) || v1.length - v2.length || v2.codePointAt(1) - v1.codePointAt(1) ) ) );
讨论地址
其实第一眼看到这个题目的时候,大概是想用code码来做的,因为我依稀记得
charCodeAt
的用法,于是有如下东西:从逻辑上看,判断下一个code码大于本次插入的code,则插入。但是细想后发现其实有点问题,因为当数组遍历到最后一位的时候,判定条件已经是超了边界的:
那可以换种思路嘛,从后一位判定会超出判定边界的话,那么可以从前面来判定:
看了一圈大佬的答案,发现还是有很多值得借鉴的地方,继续总结一些其他解法。
startsWith的方式。总体思路和第一种都是一样的,都需要遍历全部的数组得出最终的插入index:
filter拆分数组的方式:
鬼才解法,老哥666:
看到最高级的解法了目前: