具体题目要求可参照 题目及测试
1. 找出有序数组(从小到大排列)中和为sum的两个数,要求复杂度为O(n),找到一组即可
const readline = require('readline')
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
// 找出有序数组(从小到大排列)中和为sum的两个数,要求复杂度为O(n),找到一组即可
/*
数组长度 5
数组 1 3 4 6 8
sum 10
用二分查找:
1. 输入的数组input = ['5', '1 3 4 6 8', '10']
2. 对于数组 [1, 3, 4, 6, 8],头部是 i, 尾部是 j
3. 第1次先让 arr[i] + arr[j] ==> 1 + 8 = 9 ==> 9 < 10 ==> i++
4. 第2次让 arr[i] + arr[j] ==> 3 + 8 = 11 ==> 11 > 10 ==> j--
5. 第3次让 arr[i] + arr[j] ==> 3 + 6 = 9 ==> 9 < 10 ==> i++
6. 第4次让 arr[i] + arr[j] ==> 4 + 6 = 10 ==> 10 = 10 ==> 4 6
*/
const input = [] // 输入所有行的数组
const maxLine = 3 // 输入3行
function solution(input) {
// 对input进行处理,拿到数组 arr = [1, 3, 4, 6, 8]
const arr = input[1].split(' ').map(item => parseInt(item))
// 定义头部指针 i,尾部指针 j
let i = 0
let j = arr.length - 1 // 或者是 let j = parseInt(input[0])
// 找到输入的 sum
const sum = parseInt(input[2]) // 10
// 二分查找开始
while (i < j) {
let res = arr[i] + arr[j]
// 找到了
if (res === sum) {
return `${arr[i]} ${arr[j]}`
}
// 当 arr[i] + arr[j] > sum 时 , j--
if (res > sum) {
j--
}
// 当 arr[i] + arr[j] < sum 时 , i++
if (res < sum) {
i++
}
}
return 'notfonu'
}
// 出=处理多行输入
rl.on('line',(line) => {
input.push(line);
if (input.length === maxLine) {
console.log(solution(input))
rl.close()
}
})
2.有n级台阶,每一步可以走1级或2级,问一共有多少种走法
const readline = require('readline')
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
function solution(step) {
step = parseInt(step)
function walk(n) { // n为第几节台阶
if (n === 1) return 1
if (n === 2) return 2
if (n === 0) return 0
return walk(n-1) + walk(n-2)
}
return walk(step)
}
rl.on('line',(line) => {
console.log(solution(line))
})