数组的中心位
function getMiddleIndex (list) {
const leftProduct = [1]
for (let i = 1; i < list.length; i++) {
const pre = list[i - 1];
const product = pre * leftProduct[i - 1]
leftProduct.push(product)
}
const rightProduct = [1]
for (let i = list.length - 2; i >= 0; i--) {
const pre = list[i + 1];
const product = pre * rightProduct[0]
rightProduct.unshift(product)
}
for (let i = 0; i < list.length; i++) {
if (leftProduct[i] === rightProduct[i]) {
return i
}
}
return -1
}
const demoData = [
[2,5,3,6,5,6],
[1,1,1,1,1,1],
[11,22,333,3,3,3,0,23,44,5,0]
]
const result = []
demoData.forEach((item) => {
const res = getMiddleIndex(item)
result.push(res)
})
console.log(result)
获取最大软件版本号
function getBiggerVersion (v1, v2) {
const [version1, ...beta1] = v1.split('-')
const [version2, ...beta2] = v2.split('-')
const v1List = version1.split('.')
const v2List = version2.split('.')
if (beta1) {
v1List[3] = beta1.join('-')
}
if (beta2) {
v2List[3] = beta2.join('-')
}
const maxLen = Math.max(v1List.length, v2List.length)
let i = 0
while(i < maxLen) {
if (!v1List[i] && !v2List[i]) {
return v1
}
if (!v1List[i]) {
return v2
}
if (!v2List[i]) {
return v1
}
if (i < 3) {
const num1 = parseInt(v1List[i])
const num2 = parseInt(v2List[i])
if (num1 > num2) {
return v1
}
if (num1 < num2) {
return v2
}
} else {
return v1List[i] >= v2List[i] ? v1 : v2
}
i++
}
}
const demoData = [
['1.5.3', '2.5'],
['1.2.3-a', '1.1'],
['1.5', '1.5.0'],
['1.1.01', '1.01.2'],
['1.1.1-beta-11', '1.1.1-beta-2'],
['1.1.1-beta-a', '1.1.1-beta-b'],
['1.1.1-beta-1a', '1.1.1-beta-a1'],
]
const result = []
demoData.forEach((item) => {
const res = getBiggerVersion(item[0], item[1])
result.push(res)
})
console.log(result)
猜字谜
function getAnswer (riddle, answers) {
const answersList = answers.split(',')
const [answersCountWordMap, answersSimpleWordMap] = getMap(answersList)
const riddles = riddle.split(',')
const res = riddles.map((item) => {
const countWord = getCountWord(item)
const simpleWord = getSimpleWord(item)
if (answersCountWordMap[countWord]) {
return answersCountWordMap[countWord]
} else if (answersSimpleWordMap[simpleWord]) {
return answersSimpleWordMap[simpleWord]
} else {
return 'not found'
}
})
return res.join(',')
}
function getMap (list) {
const countWordMap = {}
const simpleWordMap = {}
for (var i = 0; i < list.length; i++) {
const word = list[i]
const countWord = getCountWord(word)
countWordMap[countWord] = word
const simpleWord = getSimpleWord(word)
simpleWordMap[simpleWord] = word
}
return [countWordMap, simpleWordMap]
}
function getSimpleWord(word) {
const len = word.length;
let simpleWord = ''
let pre = ''
for (let j = 0; j < len; j++) {
const cur = word[j]
if (pre !== cur) {
simpleWord += cur
pre = cur
}
}
return simpleWord
}
function getCountWord(word) {
const len = word.length;
const wordCount = []
for (let j = 0; j < len; j++) {
const index = word[j].charCodeAt() - 97
if (wordCount[index]) {
wordCount[index]++
} else {
wordCount[index] = 1
}
}
let simpleWord = ''
wordCount.forEach((item, index) => {
if (item) {
const char = String.fromCharCode(index + 97)
simpleWord += `${char}${item}`
}
})
return simpleWord
}
const demoData = [
['nwes', 'news'],
['woood', 'wood'],
['woood,wwwww', 'wood,w'],
['hesss,oeellhello', 'hello,wood'],
['woode', 'wood, wedo'],
]
const result = []
demoData.forEach((item) => {
const res = getAnswer(item[0], item[1])
result.push(res)
})
console.log(result)
合并关联端口
function getMergePorts (list) {
const [len, ...portGroupList] = list
if (len < 1 || len > 10) {
return [[]]
}
let i = 0;
while(i < portGroupList.length) {
const group = portGroupList[i]
portGroupList[i] = Array.from(new Set(group)).sort((a, b) => a-b)
i++
}
i = 0
let j = i + 1;
while(i < portGroupList.length) {
let j = i + 1;
let hasChange = false
while(j < portGroupList.length) {
const canMerge = isCanMerge(portGroupList[i], portGroupList[j]);
if (canMerge) {
hasChange = true
portGroupList[i] = Array.from(new Set([...portGroupList[i], ...portGroupList[j]])).sort((a, b) => a-b)
portGroupList.splice(j, 1)
}
j++
}
if (hasChange) {
i = 0
} else {
i++
}
}
return portGroupList
}
function isCanMerge (a, b) {
let sameNum = 0;
let i =0
let j = 0;
while (i < a.length && j < b.length) {
if (a[i] === b[j]) {
sameNum++
i++
j++
} else if (a[i] > b[j]) {
j++
} else {
i++
}
if (sameNum === 2) {
return true
}
}
return false
}
const demoData = [
[10, [1,2,3], [3],[2,3,4],[4],[3,4,5],[5],[6,7,8],[6],[9,8,7],[4,5,6,7]]
]
const result = []
demoData.forEach((item) => {
const res = getMergePorts(item)
result.push(res)
})
console.log(result)
积木游戏
function getMaxSameNumSpace (list) {
const spaces = []
const [len, ...other] = list
if (len !== other.length) {
return -1
}
other.forEach((num, index) => {
if (spaces[num]) {
spaces[num][1] = index
} else {
spaces[num] = [index]
}
})
let maxSpace = -1
spaces.forEach((item) => {
if (item && item.length === 2) {
const space = item[1] - item[0]
maxSpace = Math.max(maxSpace, space)
}
})
return maxSpace
}
const demoData = [
[5,1,2,3,1,4],
[2,1,2],
]
const result = []
demoData.forEach((item) => {
const res = getMaxSameNumSpace(item)
result.push(res)
})
console.log(result)
匿名信
function canGetLetter (newspaper, anonymousLetter) {
const newspaperMap = getList(newspaper)
const anonymousLetterMap = getList(anonymousLetter)
console.log(newspaperMap, anonymousLetterMap)
const keys = Object.keys(anonymousLetterMap)
for (var i = 0; i < keys.length; i++) {
const simpleWord = keys[i]
const num = anonymousLetterMap[simpleWord]
if (newspaperMap[simpleWord] >= num) {
newspaperMap[simpleWord] -= num
} else {
return false
}
}
return true
}
function getList (list) {
const map = {}
for (var i = 0; i < list.length; i++) {
const word = list[i]
const len = word.length;
const wordCount = []
for (let j = 0; j < len; j++) {
const index = word[j].charCodeAt() - 97
if (wordCount[index]) {
wordCount[index]++
} else {
wordCount[index] = 1
}
}
let simpleWord = ''
wordCount.forEach((item, index) => {
if (item) {
const char = String.fromCharCode(index + 97)
simpleWord += `${char}${item}`
}
})
if (map[simpleWord]) {
map[simpleWord]++
} else {
map[simpleWord] = 1
}
}
return map
}
const demoData = [
{
newspaper: ['ab', 'cd'],
anonymousLetter: ['ba']
},
{
newspaper: ['ab', 'bcd', 'ef'],
anonymousLetter: ['cbd', 'fe']
},{
newspaper: ['ab', 'bcd', 'ef'],
anonymousLetter: ['cd', 'fe']
},{
newspaper: ['wood', 'wood', 'wood'],
anonymousLetter: ['wodo', 'wdoo']
},{
newspaper: ['wood'],
anonymousLetter: ['wodo', 'wdoo']
},
]
const result = []
demoData.forEach((item) => {
const { newspaper, anonymousLetter } = item;
const res = canGetLetter(newspaper, anonymousLetter)
result.push(res)
})
console.log(result)