❤ leetCode简易题1-两数之和、简易2--回文数判断、简易14-最长公共前缀

本文介绍了如何解决LeetCode中的两数之和、回文数判断以及最长公共前缀问题,包括暴力破解、哈希表优化和双指针算法的应用,展示了编程解题的思路和优化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

❤ leetCode简易题1-两数之和、简易题14- 最长公共前缀

1、简易1-两数之和

① 题目要求

数字A + B = target,以target为求和结果,找出数组中符合的A、B数字下标。

第一次做的时候完全脑子一片蒙,随后认真看了看题目发现是发现找符合target和的两个数字下标

② 看了题解以后,第一次以双层for循环暴力破解题目【复杂度O(n²)】**

var twoSum = function (nums, target) {
    let datas = {};
    for (let i = 0; i < nums.length; i++) {
        for (let s = i + 1; s < nums.length; s++) {
            if (target==nums[i] + nums[s]) {
                return[i,s];
            }
        }
    }
};


var nums= [2,7,11,15];
var target = 9;
// twoSum([2,7,11,15],13); 
输出如下:
console.log(twoSum([2,7,11,15],13)); //2+11  [0,2]
console.log(twoSum([2,7,11,15],22)); //2+11  [1,3]

将判断条件进行改变以后【target-nums[i]== nums[s]】 代码进行了优化


  简单粗暴,2for循环逐个遍历判断
 
  var twoSum = function (nums, target) { l
 
  et datas = {};
 
  for (let i = 0; i < nums.length; i++)
 
    { for (let s = i + 1; s < nums.length; s++) {
 
       if (target-nums[i] == nums[s])
 
    { return[i,s];
 
  } } } };

③ 题解二

考虑到哈希表利用总和减去其中一个数判断另外一个数是否存在,存在:返回进去的数字下标和差值数字的下标;不存在,则记录当前减去数字的下标,方便函数下次继续判断和使用【复杂度O(n1)】**

isNaN(6) true


 var twoSum = function(nums, target) {
  var keys = {};
 
   for(var i = 0;i < nums.length; i++) {
 
     var diff = target - nums[i];
 
      // 判断差值diff在键值对中是否存在 是则找到匹配数字 数组第二个数字为7,下标为1
 
     // keys[diff]=7,i=2 
 
          if(!isNaN(keys[diff])) {
 
              // 返回减去的数字下标和差值数字的下标
 
              return [keys[diff], i];
 
         }
 
         // 未出现匹配值 将数字存入键值对中以备后续判断
        // 当前数字假设为第三个 nums[i]=7,keys[7]=1  i就是判断数字的下标  建立key值 方便下次使用
 
         // 若是7的差值不存在,当前数字7的下标就是1,将1记录为7的下标
 
         keys[nums[i]] = i;
    }
  };

2、简易2–回文数判断

① 题目要求判断回文数

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

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例如,121 是回文,而 123 不是。

② 第一种解法-翻转字符串法

题解只有简单的一句

return x.toString()===x.toString().split('').reverse().join('');

理解代码

x.toString()
x为 123456就是 => 123456
x.toString().split(‘’) 就是数组 [‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’]
reverse()函数颠倒就是 [‘6’, ‘5’, ‘4’, ‘3’, ‘2’, ‘1’]
再用join()函数转化为字符串 就是654321

作用:
—————————————————————————————————
toString()方法可以根据所传递的参数把数值转换为对应进制的数字字符串
例如:var a = 32;
console.log(a.toString(2)); //返回字符串100000
console.log(a.toString(4)); //返回字符串200
——————————————————————————————
split()把一个字符串分割成字符串数组
例如 【1】var str=“How are you doing today?”;
var n=str.split(" “); // 此处有空格
n输出的值:How,are,you,doing,today?
【2】把空字符串 (”“) 用作 separator,那么 stringObject 中的每个字符之间都会被分割
var str=“How are you doing today?”;
var n=str.split(”");
n输出的值:H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
——————————————————————————
join() 将数组元素转换为字符串
例如:【1】 ar fruits = [“Banana”, “Orange”, “Apple”, “Mango”];
var energy = fruits.join();
输出的值: Banana,Orange,Apple,Mango


【2】arr.join() // 返回的是⼀个字符串,如果数组为空则返回一个空字符串
var a = [‘a’, ‘b’, ‘c’];
var v1 = a.join(); // v1的值变为"a,b,c"
var v2= a.join(‘,’); // v2的值变为"a,b,c"
var v3 = a.join(‘+’); // v3的值变为"a+b+d"
var v4 = a.join(‘’); // v4的值变为"abc"


② 第二种解法-双指针遍历法

Math.floor()

返回小于或等于一个给定数字的最大整数

*/
如果我们测试的案例是121 
var isPalindrome = function(x) {
     var sel=x.toString();
     console.log(sel); //121
 var n=Math.floor(sel.length/2); // 1.5取整数为1 
 console.log(n); //输出1
 for(var i=0;i<n;i++){ 
     console.log(sel[i]);  // 121 的第一个位置下标为o的是1 
     console.log(sel.length-1-i);  // 长度3-1-0=2  i为0小于n为1时候,所以此处i为0 
     console.log(sel[sel.length-1-i]);  // 1 //sel[2]=1  // 0,1,2 //第三位为1   
       if(sel[i]!=sel[sel.length-1-i]) return false;
    }return true;
};

最后成功!

3、简易题14- 最长公共前缀

① 题目要求

题目如下:

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

官方给的实例:

示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"


示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

② 思路分析

分析:

取出最长公共前缀,那我们就可以直接拿第一个出来,然后转为数组,然后拿后面的每一个去跟这个第一项作比较,看里面的字符是否相同,如果后面的字符创长度比这个第一项还短,那就可以直接忽略不计。比这个长的话,游戏继续。

具体实现:
数组为空,返回’’
循环里面的字符串每个的长度 i
循环外层数组长度 s
判断flower 下的f是否和flow 下的f相同
相同=> 返回l拼接到第一个下面依次
不相同=> 返回原本的

③ 解题方法

方式一:

//
var longestCommonPrefix = function(strs) {
    if(strs.length==0){
          return ''   
      };
      var allstring = "";
      for (var s = 0; s < strs[0].length; s++) {
          var dataA = strs[0][s];
          for (var m = 1; m < strs.length; m++) {
              if ( s >= strs[m].length ||  strs[m][s] !== strs[0][s]) {
                  return allstring;
              }
              allstring +=  strs[0][s];
          }
      }
      return allstring
};

输出以后发现,虽然貌似没啥毛病,但是就是除了问题。
在这里插入图片描述

重新分析我们的逻辑可以发现

我依次使用了循环第一个数据字符串长度 ⇒ 整个数组的长度= > 当第一次能满足条件的时候,我把值塞进了allstring里面,但是这个时候返回的第一个字母l 实在我循环外层数组的时候(也就是重新循环了2次),所以返回的ll ,所以我的allstring 其实应该放到外层循环的外头即可,取循环第一次的其中相同的字符串即可。

完善我们的代码以后:

var strs = ["flower", "flow", "flight"],flower = ['f', 'l'];
      function strscommon(strs){
        if(strs.length==0){
         return ''   
        };
        var allstring = "";
        for (var s = 0; s < strs[0].length; s++) {
            var dataA = strs[0][s];
            for (var m = 1; m < strs.length; m++) {
                if ( s >= strs[m].length ||  strs[m][s] !== strs[0][s]) {
                    return allstring;
                }
            }
            allstring +=  strs[0][s];
        }
}
console.log(strscommon(strs),'strsall');

查看我们的输出结果:

fl strsall

解题完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林太白

感谢打赏,你必大富大贵之人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值