Javascript中的prototype chains

Javascript中的继承是基于prototype chain的。 对于已有的Object创建的两种方法: extend 跟Object.create()有以下区别:

<br />gold = {a:1};

log(gold.a); // 1

log(gold.z); // undefined

var blue = extend({}, gold);

blue.b = 2;

log(blue.a); // 1

log(blue.z); // undefined

var rose = Object.create(gold);

rose.b =  2;

log(rose.a); // 1

log(rose.z); // undefined;

gold.z = 3;

log(blue.z); //undefined

log(rose.z); // 3

以上例子中,分别用extend跟Object.create方法来基于现有的Object创建新的project,

其中extend是one-time的仅仅是property的复制。

而Object.create是基于其原型gold的复制,如果gold原型中的property发生改变,其创建对象也会随之改变,这个过程是一个ongoing的lookup-time delegation。

Advertisements

Javascript Scope小结

在Javascript程序执行的时候,我们定义的变量,常量,Object等各种数据结构都会存在一个in-memory storage里面也被称为Execution Context,对此我们需要注意变量相对应的scope。

Scope其实主要有两种: 全局scope跟局部scope。 全局scope顾名思义, 这里主要讨论下局部scope。 在JavaScript的function会创建一个新的Execution Context(in-memory scope), 也就是function后面的{}里的东西都属于新创建的一个Execution Context。 但是,if, for loop, while loop后面的{}不会创建新的Execution Context。 只有Function才可以创建一个新的Execution Context.

JQuery操作DOM

用JQuery操作DOM很简洁方便,JQuery Manipulation API 中常用的几个方法在此列举一下:

Class Attribute

.toggleClass(className)

Change Attributes: .attr() 方法

Modify CSS: .css()

取HTML/text内容: .html(), .text()

添加DOM元素: .append()/.prepend() 用于添加children, .insertBefore()/insertAfter() 用于添加siblings.

删除DOM元素: .remove()

Iterate: .each()

 

 

JQuery Basics

JQuery作为Javasript的library既是function又是object,并且可以用’$’来简写。 我们用JQuery可以很方便的来操作HTML页面中的DOM元素。JQuery一共提供了3种操作DOM的方式:

  1. By ‘Tags’: 直接用HTML的tags来选取对应的DOM元素,例如: $(‘h1’)
  2. By ‘ID’: 用”#”来选取ID, 例如: $(“#nav”)
  3. By ‘Class’: 用“.” 来选取class,例如$(‘.container’)

此外, JQuery还提供了各种API来对DOM进行traverse操作,JQuery API Reference 主要常用的有:

.children()

Get the children of each element in the set of matched elements, optionally filtered by a selector.

.parent()

Get the parent of each element in the current set of matched elements, optionally filtered by a selector. 返回当前元素的上一级parent

.parents()

Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector. 返回当前元素所有parents

.siblings()

Get the siblings of each element in the set of matched elements, optionally filtered by a selector.

161. One Edit Distance

今儿做微软的OA遇上了这个原题,赶紧来总结一下.
思路: 找编辑距离为1,也就是给的两个字符串中,只有一个字符不同,或者字符缺失. 分以下几种情况讨论:
1. 给定的两个字符串长度相同, 则先找到字符串不同的位置i,然后验证i+1后的子串是否相同即可。
2. 给定的两个字符串长度相差为1, 则先找到第一个对应位置不一样的那个字符,如果较长字符串在那个字符之后的部分和较短字符串那个字符及之后的部分是一样的,则符合要求.
3. 给定的两个字符串长度大于1, 则肯定不符合要求.
复杂度: Time O(n), Space O(1)

public class Solution {
    public boolean isOneEditDistance(String s, String t) {
        int sLen = s.length();
        int tLen = t.length();
        if (sLen == 0 &amp;&amp; tLen == 0) return false;
        if (sLen == tLen) return isOneEdit(s, t);
        if (sLen - tLen == 1) return isOneDeleted(s, t);
        if (tLen - sLen == 1) return isOneDeleted(t, s);
        return false;
    }

    public boolean isOneEdit(String s, String t) {
        boolean isModified = false;
        for (int i = 0; i &lt; s.length(); i++) {
            if (s.charAt(i) != t.charAt(i)) {
                if (isModified) return false;
                else isModified = true;
            }
        }
        return isModified;
    }

    public boolean isOneDeleted(String longStr, String shortStr) {
        for (int i = 0; i &lt; shortStr.length(); i++) {
            if (longStr.charAt(i) != shortStr.charAt(i)) {
                return longStr.substring(i+1).equals(shortStr.substring(i));
            }
        }
        return true;
    }
}

54. Spiral Matrix

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example,
Given the following matrix:

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

You should return [1,2,3,6,9,8,7,4,5].

思路:

public class Solution {
    public List&lt;Integer&gt; spiralOrder(int[][] matrix) {
        List&lt;Integer&gt; res = new ArrayList&lt;&gt;();
        if (matrix == null || matrix.length == 0 || matrix[0] == null || matrix[0].length == 0) return res;
        int count = 0;
        int row = matrix.length;
        int col = matrix[0].length;
        while(count * 2 &lt; row &amp;&amp; count * 2 &lt; col) {
            for (int i = count; i &lt;= col - 1 - count; i++) { // 左上-&gt;右上
                res.add(matrix[count][i]);
            }
            for (int j = count + 1; j &lt;= row - 1 - count; j++) { // 右上 -&gt; 右下
                res.add(matrix[j][col - 1 - count]);
            }
            if (row - 2 * count == 1 || col - 2 * count == 1) break; // 只有1行或者1列情况就停止
            for (int i = col - 2 - count; i &gt;= count; i--) { // 右下 -&gt; 左下
                res.add(matrix[row - 1 - count][i]);
            }
            for (int j = row - 2 - count; j &gt;= count + 1; j--) { // 左下 -&gt; 左上
                res.add(matrix[j][count]);
            }
            count++;
        }
        return res;
    }
}

268. Missing Number

Given an array containing n distinct numbers taken from 0, 1, 2, …, n, find the one that is missing from the array.

For example,
Given nums = [0, 1, 3] return 2.

Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?

思路1: 用bit XOR来做,由于给定数组的特殊性,每个数字在数组中都有与下标相对应的数
复杂度: Time O(n)

public class Solution {
    public int missingNumber(int[] nums) {
        int num = 0;
        for (int i = 0; i &lt; nums.length; i++) {
            num = num ^ nums[i];
        }
        for (int i = 0; i &lt;= nums.length; i++) {
            num = num ^ i;
        }
        return num;
    }
}

思路2: 先排序,然后用二分法找到第一个和nums[i]不相等的数i就可以了。
复杂度: Time O(nlogn)

  public int missingNumber(int[] nums) {
        Arrays.sort(nums);
        int start = 0;
        int end = nums.length - 1;
        while(start + 1 &lt; end) {
            int mid = start + (end - start) / 2;
            if (nums[mid] &gt; mid) {
                end = mid;
            } else {
                start = mid;
            }
        }
        if (start == nums[start]) {
            return end;
        }
        return start;

    }

思路3: 求和相减.
复杂度: Time O(n)

public class Solution {
    public int missingNumber(int[] nums) {
        int sum = 0;
        int len = nums.length;
        for (int i = 0; i &lt; nums.length; i++) {
            sum += nums[i];
        }
        int idxSum =  len * (1 + len)/ 2;
        return idxSum - sum;
    }
}