题目

Remove Nth Node from End of List

把倒数第N个元素从链表中删除。

比如链表1->2->3->4->5, 把倒数第二个删除(n=2),返回1->2->3->5

思路

首先是遍历整个链表,拿到链表的长度,然后根据这个长度值length和指定的n值再遍历一次链表,找到要删除节点的父节点。

实现

JavaScript:

/**
 * Definition for singly-linked list.
 */
  function ListNode(val) {
      this.val = val;
      this.next = null;
  }

/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
    var dumy = new ListNode(0), p=head,length=0;
    dumy.next =head;
    //获取链表长度
    while(p){
        length++;
        p = p.next;
    }
    p = dumy;
    //找到要删除元素的父元素
    while(length>n){
        p = p.next;
        length--;
    }
    //删除元素
    if(p.next){
        p.next = p.next.next;
    }else{
        p = null;
    }
    return dumy.next;
};

耗时

removenthfromend

题目

Merge Sorted Array

把两个有序的数组合并成一个,数组1有m个元素,数组2有n个元素。假设数组1有足够的长度(m+n)来容纳数组1和数组2,求合并后的数组1.

思路

因为不能用额外的存储空间,考虑用类似选择排序的方式来重新生成nums1.

即,原nums1的最大值和num2的最大值比较,大者放到新nums1[m+n-1]位置。
并且指针向前移一位,继续比较原nums1和num2的最大值,把大的放到新nums1[m+n-2]位置,直到一个数组的指针已经到头了。

实现

JavaScript:

/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function(nums1, m, nums2, n) {

    var k = 0,i= 0,j=0;

    if(m===0&&n===0){
        nums1.length = 0;
        return nums1;
    }
    if(n===0){
        nums1.length = m;
        return nums1;
    }
    if(m===0){
        for(;i<n;i++){
            nums1[i] = nums2[i];
        }
        nums1.length=n;
        return nums1;
    }
    //i指向原nums1中最大的数,j指向nums2中最大的数
    while(i<m&&j<n){
        //把较大的数放在nums1[m+n-1-k]中
        if(nums1[m-1-i]>=nums2[n-1-j]){
            nums1[m+n-1-k]  = nums1[m-1-i];
            i++;
        }else{
            nums1[m+n-1-k]  = nums2[n-1-j];
            j++;
        }
        k++;
    }
    if(i===m){
        while(j<n){
            nums1[m+n-1-k] = nums2[n-1-j];
            j++;
            k++;
        }
    }
};

耗时

mergesortedarray

题目

Count And Say

The count-and-say sequence is the sequence of integers beginning as follows:
1, 11, 21, 1211, 111221, …

1 is read off as “one 1” or 11.
11 is read off as “two 1s” or 21.
21 is read off as “one 2, then one 1” or 1211.
Given an integer n, generate the nth sequence.

Note: The sequence of integers will be represented as a string.

思路

递归的实现,找出CountAndSay(n)和CountAndSay(n-1)的关系。
比如1211拿一个数组记录下有多少个数组。

实现

JavaScript:

/**
 * @param {number} n
 * @return {string}
 */
var countAndSay = function(n) {
    if(n===0) return "";
    if(n===1) return "1";
    if(n===2) return "11";

    var preStrArray = countAndSay(n-1).split("");
    var tempArray=[];

    tempArray[0] = 1;
    tempArray[1] = preStrArray[0];
    for(var i = 1; i<preStrArray.length-1;i++){
        if(preStrArray[i]!==preStrArray[i-1]){
            tempArray.push(1);
            tempArray.push(preStrArray[i]);
        }else{
            tempArray[tempArray.length-2]++;
        }
    }
    if(preStrArray[i]!==preStrArray[i-1]){
        tempArray.push(1);
        tempArray.push(preStrArray[i]);
    }else{
        tempArray[tempArray.length-2] ++;
    }
    return tempArray.toString().replace(/,/g,"");
}

耗时

countandsay.png

题目Topic

反转链表
Reverse Linked List

思路How to

递归实现,先反转head后面的链表,这时原来的第二个节点(head->next)已经移到链尾了,把head赋给原来第二个节点的next,并以原head收尾,实现反转。

实现 Implementation

JavaScript:

/**
 * 递归实现
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    if(head===null||head.next===null){
        return head;
    }else{
        var newHead = reverseList(head.next);
        head.next.next = head;
        head.next=null;
        return newHead;
    }
};

耗时

reverselist

题目

Valid Anagram

判断两个字符串是否易位构造,也就是字母种类和出现的次数一样。

比如:

dear 和 read
listen 和 silent
loop 和 pool

思路

统计两个字符串的字母种类和出现的次数,如果相等则是易位构造。

实现

JavaScript:

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    //判断两个字符串是否同源,也就是字母种类和出现的次数一样
    var sArray = s.split(""),tArray= t.split(""),sMap={};

    //先判断s和t的长度是否相等
    if(s.length!== t.length){
        return false;
    }
    //获取s字符串的字母种类和每个字母出现的次数
    for(var i=0;i<sArray.length;i++){
        if(!sMap[sArray[i]]){
            sMap[sArray[i]] = 1;
        }else{
            sMap[sArray[i]]++;
        }
    }

    //根据sMap来判断t字符串是否和s同源
    for(i=0;i<tArray.length;i++){
        if(sMap[tArray[i]]){
            sMap[tArray[i]]--;
            if(sMap[tArray[i]]<0){
                return false;
            }
        }else{
            return false;
        }
    }
    return true;
};

PS: 因为这个题目在leetcode上比较新,所以还没有出来JS运行时常的比较。

今天周末就不写技能性的学习了,讲下刚才逛知乎的一点感悟。

如何有效地利用碎片化的时间

看了玉伯的回答顿时豁然开朗

尽量减少碎片时间。

对于无法减少的碎片时间,则好好感受天空、泥土与空气。

常常抱怨时间不够,要学习的东西太多而自己总是浪费在无意义的事情上,也常常抱怨和家人和朋友的相处太少,更会因为男朋友和自己聊天也不时刷微博的恼怒。

然后把自己陷入到烦恼自责的生活中,但其实这样不好。

不要给自己上发条,要找到乐趣,并享受之。

就像玉伯在签名一样,因上努力,果上随缘,这样不是更好么?

Steps

1 Run -> Edit Configuration

2 Press Add button (+)

3 Type the configurations

gruntdebuginwebstorm

4 Set breakpoint where you want

5 Press Shift+Ctrl+D to debug