❤ 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]】 代码进行了优化
简单粗暴,2遍for循环逐个遍历判断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];} } } };
③ 题解二
考虑到哈希表利用总和减去其中一个数判断另外一个数是否存在,存在:返回进去的数字下标和差值数字的下标;不存在,则记录当前减去数字的下标,方便函数下次继续判断和使用【复杂度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); //121var n=Math.floor(sel.length/2); // 1.5取整数为1 console.log(n); //输出1for(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
解题完成!