• js基础算法


     1、js实现两数之和

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

    方法一: 

    1. var num = [2, 7, 11, 15];
    2. function twoSum(arr, target) {
    3. var brr = [];
    4. for (var i = 0; i < arr.length-1; i++) {
    5. for (var j = i+1; j < arr.length; j++) {
    6. if (arr[i] + arr[j] == target) {
    7. brr[0] = j;
    8. brr[1] = i;
    9. }
    10. }
    11. }
    12. return brr;
    13. }
    14. let result = twoSum(num, 18);
    15. console.log(result)

    方法二:

    1. var nums = [2, 7, 11, 15];
    2. function twoSum(arr, target) {
    3. var obj = {};
    4. var brr = [];
    5. //debugger;
    6. for (var i = 0; i < arr.length; i++) {
    7. let a = arr[i];
    8. let b = target - a;
    9. if (obj[a] !== undefined) {
    10. brr = [obj[a], i];
    11. } else {
    12. obj[b] = i;
    13. }
    14. }
    15. return brr;
    16. }
    17. let result = twoSum(nums, 9);
    18. console.log(result)

    方法三:

    1. var nums=[2,7,11,15];
    2. var twoSum =function(nums,target){
    3. for(let i=0;ilength-1;i++){
    4. for(let j=i+1;jlength;j++){
    5. if(nums[i]+nums[j]==target){
    6. return [i,j];//返回他们索引下标
    7. }
    8. }
    9. }
    10. }
    11. let result =twoSum(nums,18);
    12. console.log(result);

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

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

     方法一:

    1. function alterContext(fn, obj) {
    2. this.greeting = obj.greeting;
    3. this.name = obj.name;
    4. return this.greeting + ', ' + this.name + '!';
    5. }

     方法二:

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

    方法三:

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

    方法四:

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

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

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

    方法一:

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

     方法二:

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

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

    1. var romanToInt = function(s) {
    2. var sArr = s.split("");//罗马数字变数组
    3. function initNum (sArr) {//罗马数字的数组通过switch变成数字数组
    4. for (var i = 0; i < sArr.length; i++) {
    5. switch (sArr[i]) {
    6. case "I" :
    7. sArr[i] = 1;
    8. break;
    9. case "V" :
    10. sArr[i] = 5;
    11. break;
    12. case "X" :
    13. sArr[i] = 10;
    14. break;
    15. case "L" :
    16. sArr[i] = 50;
    17. break;
    18. case "C" :
    19. sArr[i] = 100;
    20. break;
    21. case "D" :
    22. sArr[i] = 500;
    23. break;
    24. case "M" :
    25. sArr[i] = 1000;
    26. break;
    27. }
    28. }
    29. }
    30. initNum (sArr)
    31. return sArr.reduce(function (acc,item,idx,arr) {//reduce累加数组里的数字,并且额外注意,如果小的罗马数字在大的数字左侧,就代表要减去,但我们前面累加了一次,所以要减去两次
    32. acc += item;
    33. if (arr[idx] < arr[idx + 1]) {
    34. acc = acc - (2 *arr[idx]);
    35. }
    36. return acc;
    37. },0)
    38. };
    39. console.log(romanToInt('M'));

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

    示例:
    输入:strs = ["flower","flow","flight"]
    输出:"fl"
    1. var longestCommonPrefix = function(strs) {
    2. var re = '';
    3. if (!strs.length) return re;
    4. for (var j=0;j0].length;j++){//第j位
    5. for (var i=1;ilength;i++){//第i个
    6. if (strs[i][j]!=strs[0][j]) return re
    7. }
    8. re += strs[0][j];
    9. }
    10. return re;
    11. };
    12. console.log(longestCommonPrefix["flower","flow","flight"]);

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

    有效字符串需满足:

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

    示例 1:

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

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

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

    1. const enumObj = {
    2. ")":"(",
    3. "]":"[",
    4. "}":"{",
    5. }
    6. var isValid = function(s) {
    7. let cache = [];
    8. let arr = s.split("");
    9. for(let i of arr){
    10. if(enumObj[i]){
    11. if(cache[cache.length - 1] === enumObj[i]){
    12. cache.pop()
    13. }else{
    14. cache.push(i)
    15. }
    16. }else{
    17. cache.push(i)
    18. }
    19. }
    20. return cache.length === 0
    21. };
    22. console.log(isValid("(}"));

  • 相关阅读:
    跟我读CVPR 2022论文:基于场景文字知识挖掘的细粒度图像识别算法
    prometheus监控java应用的jvm指标
    【STM32】STM32H750VBT6 CubeMX USBFS-UVC设备实现,以及移植问题
    单例模式:饿汉式
    浏览器垃圾回收机制
    R语言ggplot2可视化:使用ggplot2可视化散点图、使用scale_x_log10函数配置X轴的数值范围为对数坐标
    JavaScript-DOM
    解密游戏推荐系统的建设之路
    秒杀与高并发,阿里核心技术手册,淘宝如何解决破亿点击访问问题?
    多个装饰器修饰一个函数
  • 原文地址:https://blog.csdn.net/qq_43405603/article/details/125408380