Leetcode算法题练习

1、合并并排序两个单链表:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists=function(l1,l2){
    var arr=[];
    while(l1){
        arr.push(new ListNode(l1.val));
        l1=l1.next;
    }
    while(l2){
        arr.push(new ListNode(l2.val));
        l2=l2.next;
    }
    if(!arr.length) return null;
    arr.sort(function(a,b){
        return a.val-b.val;
    });
    for(var i=0;i<arr.length-1;i++)
    {
        arr[i].next=arr[i+1];
    }
    return arr[0];
};

注意将生成新节点,然后将每个节点的值复制,放入数组中,对每个节点统一排序,然后再把指针指向后面的节点即可,最后只需要返回头节点,因为头结点包含后面所有的节点。

2、括号匹配:

题目:

Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]" are not.

var isValid = function(s) {
    var sta=[],
    target={
        '(':')',
        '[':']',
        '{':'}'
    };
    for(var i=0;i<s.length;i++){
        if(!sta.length) sta.push(s[i]);
        else{
            if(s[i]===target[sta[sta.length-1]]){
                sta.pop();
            }
            else{
                sta.push(s[i]);
            }
        }
    }
    return !sta.length;

};

注意要把不匹配的push到数组中,因为每次只跟栈顶的元素比对,为了保证只有相邻的括号才能匹配且通过最后数组长度来判断是否满足要求。

3、找字符串数组最长的公共前缀:

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
      if (!strs.length) return '';

      var len = strs.reduce(function(pre, item) {
        return Math.min(pre, item.length);
      }, Number.MAX_VALUE);

      var ans = '';
      for (var i = 0; i < len; i++) {
        var a = strs[0][i];
        var f = strs.every(function(item) {
          return item[i] === a;
        });

        if (!f) break;
        ans += a;
      }

      return ans;
    
};

注意数组的reduce方法和every方法的使用,注意every方法返回的是布尔值true or false。

4、输出去重后的数组的长度(不能新建数组):

/**
 * @param {number[]} nums
 * @return {number}
 */

var removeDuplicates = function(nums) {
  var ans = 0;
  for (var i = nums.length; i--; ) {
    if (i === nums.length - 1)
      ans++;
    else if (nums[i] === nums[i + 1])
      nums.splice(i, 1);
    else 
      ans++;
  }

  return ans;
};

5、【经典】连续子数组的最大和:

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
  var maxn = -Number.MAX_VALUE;
  var sum = 0;
  nums.forEach(function(item, index, array) {
    sum += item;
    if (sum > maxn)
      maxn = sum;
    if (sum < 0)
      sum = 0;
  });

  return maxn;
};

注意maxn的值可以用来区别数组是否是无效的,当和为负时重新开始计算,还要注意记录最大和,只有当比之前的大的时候才更新maxn。

posted @ 2017-09-13 14:13  爱笑的小飞象  阅读(123)  评论(0编辑  收藏  举报