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("(}"));