leetcode(1)

判断是否为回文整数

  • 或者只判断后半部分反转是否等于前半部分
var isPalindrome = function(x) {
  if(x<0||(x%10==0&&x!=0)){
    return false;
  }
  var changeNum=x;
  var num=0;
  while(changeNum!=0){
    num=num*10+changeNum%10;
    changeNum=parseInt(changeNum/10);
  }
  return num==x;
};
console.log(isPalindrome("120"))

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

  • 有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    注意空字符串可被认为是有效字符串。

var isValid = function(s) {
     var stack=[];
    s=s.toString().split("");
    for(var item of s){
      if(item=="("||item=="["||item=="{"){
        stack.unshift(item);
      }else{
        if(stack.length!==0){
          var now=stack.shift();
          if((now=="("&&item!==")")||(now=="["&&item!=="]")||(now=="{"&&item!=="}")){
            return false;
          }
        }else{
          return false;
        }
      } 
    }
    if(stack.length==0){
      return true;
    }else{
      return false;
    }
};
//执行用时 : 92 ms, 在Valid Parentheses的JavaScript提交中击败了84.95% 的用户
//内存消耗 : 34.4 MB, 在Valid Parentheses的JavaScript提交中击败了52.21% 的用户
var isValid = function (s) {
    let stack = []
    let paren_map = { ')': '(', ']': '[', '}': '{' }
    for (const c of s) {
        if (!(c in paren_map)) stack.push(c)
        else if (!stack.length || paren_map[c] != stack.pop()) return false
    }
    return !stack.length
};
//执行用时 : 88 ms, 在Valid Parentheses的JavaScript提交中击败了96.12% 的用户
//内存消耗 : 34.2 MB, 在Valid Parentheses的JavaScript提交中击败了54.18% 的用户

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

var longestCommonPrefix = function(strs) {
    let minLen=Math.min(...strs.map(x=>x.length));
    let res="";
    for(let i=0;i<minLen;i++){
        let newset=new Set(strs.map(x=>x[i]));
        if(newset.size==1){
            res+=[...newset][0];//把他变成数组
        }else{
            break;
        }
    }
    return res;
};
//执行用时 : 132 ms, 在Longest Common Prefix的JavaScript提交中击败了27.53% 的用户
//内存消耗 : 33.9 MB, 在Longest Common Prefix的JavaScript提交中击败了82.51% 的用户
var longestCommonPrefix = function(strs) {
      let minLen=Math.min(...strs.map(x=>x.length));
    if(!strs||strs.length==0)return "";
    let res="";
    for(let i=0;i<minLen;i++){
        var now=strs[0][i];
      console.log(now);
        if(strs.every(val=>val[i]==now)){
            res+=now;
        }else{
            break;
        }
    }
   return res;
};
//执行用时 : 104 ms, 在Longest Common Prefix的JavaScript提交中击败了63.87% 的用户
//内存消耗 : 35.2 MB, 在Longest Common Prefix的JavaScript提交中击败了30.03% 的用户

荷兰国旗

let arr = [0,1,2,1,1,2,0,2,1,0];

       
function paixu(arr){
  let current = 0;
  let begin = 0;
  let end = arr.length-1;

  while(current <= end ){
    if(arr[current] == '0'){
      [arr[current],arr[begin]]= [arr[begin],arr[current]];
      current++;
      begin++;
    }else if(arr[current] == '1'){
      current++;
    }else if(arr[current] == '2'){
      [arr[current],arr[end]] = [arr[end],arr[current]]
      end -- ;
    }
  }
  console.log(arr);
}

paixu(arr);

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
该问题是非常典型的、入门的动态规划问题。很多算法书上的都采用类似的例子来开始介绍动态规划。

设计动态规划的三个步骤
将问题分解成最优子问题;
用递归的方式将问题表述成最优子问题的解;
自底向上的将递归转化成迭代;(递归是自顶向下);
最优子问题
对于连续的 nn 栋房子:H1,H2,H3......HnH 1 ,H 2 ,H 3 ......H n ,小偷挑选要偷的房子,且不能偷相邻的两栋房子,方案无非两种:
方案一:挑选的房子中包含最后一栋;
方案二:挑选的房子中不包含最后一栋;
获得的最大收益的最终方案,一定在这两种方案中产生,用代码表述就是:
最优结果 = Math.max(方案一最优结果,方案二最优结果)

子问题的递归表述
JavaScript
var robTo = function (nums, lastIndex) {
if (lastIndex === 0) {
return nums[0];
}

// 方案一,包含最后一栋房子,则应该丢弃倒数第二栋房子
let sum1 = robTo(nums, lastIndex - 2) + nums[lastIndex]; 

// 方案二,不包含最后一栋房子,那么方案二的结果就是到偷到 lastIndex-1 为止的最优结果
let sum2 = robTo(nums, lastIndex - 1); 

return Math.max(sum1, sum2);

};
将问题表述成最优子问题的解后,这个问题就解决了:

JavaScript
var rob = function(nums) {
return robTo(nums, nums.length - 1);
};
递归转迭代
到上一步为止,该问题就已经解决了。但是递归的方式性能太差,中间有太多重复的计算,所以还需要最后一步:将 自顶向下 的递归,转化成 自底向上 的迭代。

JavaScript
var rob = function(nums) {
if (nums.length === 0) {
return 0;
}
if (nums.length === 1) {
return nums[0];
}

// 仍然用两个变量来存储方案一和方案二的最优结果
// 不同的是,这次从0开始,lastIndex 取最小值 1
let sum1 = nums[0];
let sum2 = nums[1];

// 然后通过迭代不断增大 lastIndex,过程中维护新的sum1,sum2,直到数组末尾
for (let lastIndex=2; lastIndex<nums.length; lastIndex++) {
    let tmp = sum1;

    // 此时的方案一就是上一步中的方案二,
    // 但要求的是最优解,所以要判断前一步的 sum1 和 sum2 哪个更大
    if (sum2 > sum1) {
        sum1 = sum2;
    }

    // sum2 是包含最后一栋房子的方案, 
    // 每向后增加一栋房子,就是前一步的 sum1(不包含 lastIndex - 1 ) 
    // 加上当前 lastIndex 栋房子的金钱
    sum2 = tmp + nums[lastIndex]; 
}

return sum1 > sum2 ? sum1 : sum2;

};

报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

  1. 1
    
  2. 11
    
  3. 21
    
  4. 1211
    
  5. 111221
    

1 被读作 "one 1" ("一个一") , 即 11。
11 被读作 "two 1s" ("两个一"), 即 21。
21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。

给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。

注意:整数顺序将表示为一个字符串。

var countAndSay = function(n) {
     return createStr(1, ['1'], n)

    function createStr(index, str, n) {
        if(index == n)
            return str.join('')
        index++
        let newChar = []
        let k = 1
        for(let j = 0; j < str.length; j++) {
            let char = str[j]
            if(char == str[j+1] && j != str.length - 1) {
                   k++
            }else {
                newChar.push(k)
                newChar.push(str[j])
                k=1
            }
        }
        return createStr(index, newChar, n)
    }  
};

寻找和为定值的两个数

  • 输入一个整数数组和一个整数,在数组中查找一对数,满足它们的和正好是输入那个整数。如果有多对数的和等于输入的整数,输出任意一对即可。
//在数组有序的前提下采用排序夹逼的方法

function findNums(numArr,sum){
 // sort(numArr);
  
  let begin = 0;
  let end = numArr.length-1;
  
  //需要一个满足循环条件,勿忘
  while(begin<end){
    curSum = numArr[begin] + numArr[end];
    if(curSum === sum){
      console.log(numArr[begin], numArr[end]);
      
      //不要忘记break
      //break;
      
      //如果想输出所有对,加上这两句
      begin++;
      end--;
    }else if(curSum < sum){
      begin++;
    }else{
      end--;
    }
  }
  
}
findNums([1,2,3,4,5,6],9)

最大连续子数组和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    let maxsums = nums[0];
    let cursums = 0;
    
    for(let i=0;i<nums.length;i++){
        if(cursums>=0){
            cursums += nums[i];
        }else if(cursums<0){
            cursums = nums[i];
        }
        if(cursums>maxsums){
            maxsums = cursums;
        }
        
    }
    return maxsums;
};

按奇偶排序数组

给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素

/**
 * @param {number[]} A
 * @return {number[]}
 */
function isodd(num){
    if(num%2 === 0){
        return false;
    }else{
        return true;
    }
}
var sortArrayByParity = function(nums) {
    let head = 0;
    let end = nums.length-1;
    while(head<end){
        if(!isodd(nums[head])){
            head++;
        } else if(isodd(nums[end])){
            end--;
        }else{
          temp = nums[head];
           nums[head] = nums[end];
           nums[end] = temp;
       }
    }
    return nums;
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354