两数之和-----------------------------------------------------------
给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
输入: [3,2,4],6
返回值: [2,3]
说明: 因为 2+4=6 ,而 2的下标为2 , 4的下标为3 ,又因为 下标2 < 下标3 ,所以输出[2,3]
function twoSum( numbers , target ) {
var map = new Map();
for(i = 0; i < numbers.length; i++){
if(map.get(target - numbers[i]) !== undefined) {
return [map.get(target - numbers[i]) + 1, i + 1];
}
map.set(numbers[i], i)
}
}
单词消消乐-----------------------------------------------------------
"一清二白,白头偕老,老当益壮.....",牛牛和牛妹在玩成语接龙,但是牛妹因为语文不好总是输,于是她想出了一个新的游戏去和牛牛玩,牛妹会给牛牛n个单词,牛妹要求牛牛将这n个单词按照以下方式合并:
1.从左往右合并单词,将合并后的单词作为第一个单词再与后面单词合并
例如有三个单词"a","b","c",先将"ab"合并,最后将合并后的"ab"与"c"合并得到"abc"。
2.如果最左边单词结尾字母与其后面一个的单词的开始字母相同,则最左边单词的结尾字母与之后一个单词的开始字母都会抵消掉而消失,重复上述操作直到某一个单词为空或者最左端的结尾字母与之后单词的开始字母不同,然后合并这两个单词作为一个单词放置再最左边。
例如 "aab" "bac"合并之后会得到"ac"
返回最终合并后的单词。
若为空则返回一个空串。
输入: ["aab","bac","ccd"]
返回值: "acd"
说明:
"aab"与"bac"合并得到"ac"
"ac"再与"ccd"合并得到"acd"
WordsMerge(["aab","bac","ccd"])
function WordsMerge( Words ) {
Words.reduce(function(total, cur) {
if(total.charAt(total.length - 1) === cur.charAt(0)){
Words[0] = total.substring(0, total.length - 1);
Words[1] = cur.substring(1);
WordsMerge(Words)
} else {
Words[1] = total + cur
Words.shift()
WordsMerge(Words)
}
})
return Words[0]
}
function WordsMerge( Words ) {
for(var i = 0; i < Words.length - 1; i++){
if(Words[i].charAt(Words[i].length - 1) === Words[i + 1].charAt(0)) {
Words[i] = Words[i].substring(0, Words[i].length - 1);
Words[i + 1] = Words[i + 1].substring(1);
WordsMerge(Words)
} else {
Words[i + 1] = Words[i] + Words[i + 1]
Words[i] = ''
}
}
return Words[Words.length - 1]
}
枪打出头鸟-----------------------------------------------------------
现在有n个人站成一列,第i个人的身高为a_{i-1}a i−1
他们人手一把玩具枪,并且他们喜欢把枪举在头顶上。
每一次练习射击,他们都会朝正前方发射一发水弹。
这个时候,第i个人射击的水弹,就会击中在他前面第一个比他高的人。
牛牛认为这样的练习十分的荒唐,完全就是对长得高的人的伤害。
于是它定义了一个荒唐度,初始为0。
对于第i个人,如中他击中了第j个人,则荒唐度加j,如果没有击中任何人,则荒唐度加0.
牛牛想问你,你能计算出荒唐度是多少吗?
输入: 5,[1,2,3,4,5]
返回值: 0
说明: 没有一个人击中任何一个人
输入: 5,[5,4,3,2,1]
返回值: 10
说明: 第二个人击中第一个人,第三个人击中第二个人,第四个人击中第三个人,第五个人击中第四个人; 1+2+3+4=10
function solve( n , a ) {
var sum = 0;
for(var i = 0; i < a.length; i++){
for(var j = i + 1; j <a.length ; j++) {
if(a[i] > a[j]){
sum = sum + i
}
}
}
return sum
}
和为K的连续子数组-----------------------------------------------------------
给定一个无序数组 arr , 其中元素可正、可负、可0。给定一个整数 k ,求 arr 所有连续子数组中累加和为k的最长连续子数组长度。保证至少存在一个合法的连续子数组。
[1,2,3]的连续子数组有[1,2],[2,3],[1,2,3] ,但是[1,3]不是
输入: [1,-2,1,1,1],0
返回值: 3
输入: [1,-2,1,1,1],0
返回值: 3
maxlenEqualK([1, 1, 4, 2, 1, 1, 2], 6)
function maxlenEqualK( arr , k ) {
// write code here
var res = []
for(var i = 0; i < arr.length; i++){
var sum = arr[i];
for(var j = i + 1; j < arr.length; j++){
sum = sum + arr[j]
if(sum === k){
res.push(j - i + 1);
break;
}
if(sum > k) {
break;
}
}
}
res = Math.max.apply(null, res)
return res
}
function maxlenEqualK( arr , k ) {
// write code here
let sum = 0
let res = 0
const map = new Map()
let len = arr.length
map.set(0,-1) //应该从-1位置开始累加,也就是如果任何一个数都不加时,累加和为0,
for(let i=0;i<len;i++){
sum += arr[i]
let num = sum -k
if(!map.has(sum)) map.set(sum,i)
if( map.has(sum -k)) res = Math.max(res, i - map.get(sum -k))
}
return res
}
找出重复的数-----------------------------------------------------------
在包含 n+1 个数的序列 a 中找出重复的数。序列 a 中包含从 1 到 n 的整数,且只有一个数有重复值。
输入: 4,[1,2,1,4,3]
返回值: 1
function search( n , a ) {
// write code here
a.sort((a, b) => {return a-b})
for(var i = 0; i < n; i++){
if(a[i] === a[i + 1]){
return a[i]
}
}
}
跳台阶-----------------------------------------------------------
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
输入: 2
返回值: 2
说明:
青蛙要跳上两级台阶有两种跳法,分别是:先跳一级,再跳一级或者直接跳两级。因此答案为2
输入: 7
返回值: 21
示例3
输入: 0
返回值: 0
function jumpFloor(number){
if (number <= 2) return number;
else return jumpFloor(number - 1) + jumpFloor(number - 2)
}