js基础算法练习

 1、js实现两数之和

 

要求: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
 示例:
 给定 nums = [2, 7, 11, 15], target = 9
 因为 nums[0] + nums[1] = 2 + 7 = 9
 所以返回 [0, 1]

方法一: 

var num = [2, 7, 11, 15];
function twoSum(arr, target) {
      var brr = [];
      for (var i = 0; i < arr.length-1; i++) {
          for (var j = i+1; j < arr.length; j++) {
              if (arr[i] + arr[j] == target) {
                  brr[0] = j;
                  brr[1] = i;
              }
          }
      }
      return brr;
  }
let result = twoSum(num, 18);
console.log(result)

方法二:

var nums = [2, 7, 11, 15];
    function twoSum(arr, target) {
        var obj = {};
        var brr = [];
        //debugger;
        for (var i = 0; i < arr.length; i++) {
            let a = arr[i];
            let b = target - a;
            if (obj[a] !== undefined) {
                brr = [obj[a], i];
            } else {
                obj[b] = i;   
            }
        }
        return brr;
    }
    let result = twoSum(nums, 9);
    console.log(result)

方法三:

var nums=[2,7,11,15];
  var twoSum =function(nums,target){
      for(let i=0;i<nums.length-1;i++){
          for(let j=i+1;j<nums.length;j++){
              if(nums[i]+nums[j]==target){
                  return [i,j];//返回他们索引下标
              }
          }
      }
  }
let result =twoSum(nums,18);
console.log(result);

2、将函数 fn 的执行上下文改为 obj,返回 fn 执行后的值

输入:alterContext(function() {return this.greeting + ', ' + this.name + '!'; }, {name: 'Rebecca', greeting: 'Yo' })
输出:Yo, Rebecca!

 方法一:

function alterContext(fn, obj) {
      this.greeting = obj.greeting;
      this.name = obj.name;
      return this.greeting + ', ' + this.name + '!';
}

 方法二:

function alterContext(fn, obj) {
    return fn.call(obj); //把fn的this指向obj
}

方法三:

function alterContext(fn, obj) {
    return fn.bind(obj)(); // 改变fn中的this,fn并不执行,预处理更改this,所以此时让它执行
}

方法四:

function alterContext(fn, obj) {
    return fn.apply(obj);//区别call传参方式是数组了
}

3、给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。 

方法一:

var isPalindrome = function(x) {
    return x.toString() === x.toString().split('').reverse().join('');
                   //x转字符串、字符串转数组、倒序、数组转字符串(因为字符串不能直接倒序)
};

 方法二:

var isPalindrome = function(x) {
    if (x >= 0) {//如果是负数直接排除回文数的可能
        var X = x.toString();//把数字变成字符串
        var len = X.length;//字符串长度
        for(var i = 0; i < (len/2) ;i++) {//不用从后往前从前往后再来一次所以取一半长度循环
              if (X[i] != X[len - i - 1] ) {//如果有这里有一个元素不满足,直接返回false
                return false//525
              } 
        }
        return true//排除上面循环不满足条件的数字和外面套的if排除的负数,剩下的就是回文数返回true
      }
    return false
};
console.log(isPalindrome(121));

4、给定一个罗马数字,将其转换成整数。下边是对照表。

var romanToInt = function(s) {
   var sArr = s.split("");//罗马数字变数组
     function initNum (sArr) {//罗马数字的数组通过switch变成数字数组
       for (var i = 0; i < sArr.length; i++) {
         switch (sArr[i]) {
           case "I" :
             sArr[i] = 1;
             break;
           case "V" :
             sArr[i] = 5;
             break;
           case "X" :
             sArr[i] = 10;
             break;
           case "L" :
             sArr[i] = 50;
             break;
           case "C" :
             sArr[i] = 100;
             break;
           case "D" :
             sArr[i] = 500;
             break;
           case "M" :
             sArr[i] = 1000;
             break;
         }
       }  
     }
     initNum (sArr)
     return sArr.reduce(function (acc,item,idx,arr) {//reduce累加数组里的数字,并且额外注意,如果小的罗马数字在大的数字左侧,就代表要减去,但我们前面累加了一次,所以要减去两次
       acc += item;
       if (arr[idx] < arr[idx + 1]) {
         acc = acc - (2 *arr[idx]);
       }
       return acc;
     },0)
};
console.log(romanToInt('M'));

5、编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""

示例:
输入:strs = ["flower","flow","flight"]
输出:"fl"
var longestCommonPrefix = function(strs) {
    var re = '';
    if (!strs.length) return re;
    for (var j=0;j<strs[0].length;j++){//第j位
        for (var i=1;i<strs.length;i++){//第i个
            if (strs[i][j]!=strs[0][j]) return re
        }
        re += strs[0][j];
    }
    return re;
};
console.log(longestCommonPrefix["flower","flow","flight"]);

6、给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
 

示例 1:

输入:s = "()"
输出:true
示例 2:

输入:s = "()[]{}"
输出:true
示例 3:

输入:s = "(]"
输出:false

const enumObj = {
    ")":"(",
    "]":"[",
    "}":"{",
}


var isValid = function(s) {
    let cache = [];
    let arr = s.split("");
    for(let i of arr){
        if(enumObj[i]){
            if(cache[cache.length - 1] === enumObj[i]){
               cache.pop()
            }else{
                cache.push(i)
            }
        }else{
            cache.push(i)
        }
    }
    return cache.length === 0
};
console.log(isValid("(}"));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值