readyState的五个状态

0 初始化
1 载入
2 载入完成
3 交互
4 完成

自定义事件

var Event = {
    _listeners: {},    
    // 添加
    addEvent: function(type, fn) {
        if (typeof this._listeners[type] === "undefined") {
            this._listeners[type] = [];
        }
        if (typeof fn === "function") {
            this._listeners[type].push(fn);
        }    
        return this;
    },
    // 触发
    fireEvent: function(type) {
        var arrayEvent = this._listeners[type];
        if (arrayEvent instanceof Array) {
            for (var i=0, length=arrayEvent.length; i<length; i+=1) {
                if (typeof arrayEvent[i] === "function") {
                    arrayEvent[i]({ type: type });    
                }
            }
        }    
        return this;
    },
    // 删除
    removeEvent: function(type, fn) {
        var arrayEvent = this._listeners[type];
        if (typeof type === "string" && arrayEvent instanceof Array) {
            if (typeof fn === "function") {
                // 清除当前type类型事件下对应fn方法
                for (var i=0, length=arrayEvent.length; i<length; i+=1){
                    if (arrayEvent[i] === fn){
                        this._listeners[type].splice(i, 1);
                        break;
                    }
                }
            } else {
                // 如果仅仅参数type, 或参数fn邪魔外道,则所有type类型事件清除
                delete this._listeners[type];
            }
        }
        return this;
    }
};

最大深度

int MaxDepth ( TreeNode* root ) {
    int depth = 0;
    if ( root ) {
        int ldepth = MaxDepth ( root -> left );
        int rdepth = MaxDepth ( root -> right );
        depth = ( ldepth > rdepth ) ? ldepth + 1 : rdepth + 1;
    }
    return depth;
}

最小深度

int MinDepth(TreeNode* root) {
    if (root == nullptr) return 0;
    int l = MinDepth(root->left);
    int r = MinDepth(root->right);
    if (l==0 || r==0) { return l+r+1; }
    return (l<r?l:r)+1;
}

堆排序

function AdjustHeap(arr, pos, len){
   var swap = arr[pos];      //保存当前节点
   var child = pos * 2 + 1;  //定位到当前节点的左边的子节点
   while(child < len){       //递归遍历所有的子节点
       //判断当前节点是否有右节点,若右节点较大,就采用右节点和当前节点进行比较
       if(child + 1 < len && arr[child] < arr[child + 1]){
           child += 1;
       }
       //比较当前节点和最大的子节点,小于就交换,交换后将当前节点定位到子节点上
       if(arr[pos] < arr[child]){
           arr[pos] = arr[child];
           pos = child;
           child = pos * 2 + 1;
       }
       else{
           break;
       }
       arr[pos] = swap;
   }
}

/* 构建堆:
* 满足:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子结点的关键字。
* 实现:从最后一个拥有子节点的节点开始,将该节点和其他节点进行比较,将最大的数交换给该节点,
*      交换后再依次向前节点进行相同的交换处理,直到构建出大顶堆。
*/
function BuildHeap(arr){

 for(var i=arr.length/2; i>=0; i--){  //构建打顶堆
    console.log(i)
     AdjustHeap(arr, i, arr.length);
 }
}

/*堆排序算法*/
function HeapSort(arr){
   BuildHeap(arr); //构建堆
   for(var i=arr.length-1; i>0; i--){   //从数组的尾部进行调整
       var swap = arr[i];  //堆顶永远是最大的元素,将堆顶和尾部元素交换,最大元素就保存在尾部,并且不参与后面的调整
       arr[i] = arr[0];
       arr[0] = swap;
       AdjustHeap(arr, 0, i); //将最大的元素进行调整,将最大的元素调整到堆顶
   }
}

var arr = [46,12,33,72,68,19,80,33,9];
console.log('before: ' + arr);
HeapSort(arr);
console.log(' after: ' + arr);

document.compatMode

BackCompat:标准兼容模式关闭。
CSS1Compat:标准兼容模式开启。

当document.compatMode等于BackCompat时,浏览器客户区宽度是document.body.clientWidth;
当document.compatMode等于CSS1Compat时,浏览器客户区宽度是document.documentElement.clientWidth。

浏览器客户区高度、滚动条高度、滚动条的Left、滚动条的Top等等都是上面的情况。

一个准确获取网页客户区的宽高、滚动条宽高、滚动条Left和Top的代码:

if (document.compatMode == "BackCompat") {
    cWidth = document.body.clientWidth;
    cHeight = document.body.clientHeight;
    sWidth = document.body.scrollWidth;
    sHeight = document.body.scrollHeight;
    sLeft = document.body.scrollLeft;
    sTop = document.body.scrollTop;
}
else { //document.compatMode == "CSS1Compat"
    cWidth = document.documentElement.clientWidth;
    cHeight = document.documentElement.clientHeight;
    sWidth = document.documentElement.scrollWidth;
    sHeight = document.documentElement.scrollHeight;
    sLeft = document.documentElement.scrollLeft == 0 ? document.body.scrollLeft : document.documentElement.scrollLeft;
    sTop = document.documentElement.scrollTop == 0 ? document.body.scrollTop : document.documentElement.scrollTop;
}

不使用第三个变量交换两个变量

方法1,算术运算(加减):

x=x+y; //x暂存两数之和
y=x-y; //y为两数之和减去y,即原来的x
x=x-y; //x为两数之和减去现在的y(原来的x),变成原来的y
方法2,逻辑运算(异或):

x^=y;//x先存x和y两者的信息
y^=x;//保持x不变,利用x异或反转y的原始值使其等于x的原始值
x^=y;//保持y不变,利用x异或反转y的原始值使其等于y的原始值

addEventListener和onclick

addEventListener注册的事件不会被覆盖,而onclick会被覆盖

encodeURI和encodeURIComponent和escape

encodeURI:该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ’ ( ) 。
该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#
encodeURIComponent:该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ’ ( ) 。
其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。
escape:该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值