NIO

Java NIO主要目的是为了提升速度。

标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。

Java NIO由以下几个核心部分组成:

    阅读全文

    c++虚函数与纯虚函数的区别

    定义一个函数为虚函数,不代表函数为不被实现的函数。

    定义它为虚函数是为了允许用基类的指针来调用子类的这个函数

    定义一个函数为纯虚函数,才代表函数没有被实现。

    阅读全文

    JAVA内存区域

    Java运行时数据区域分为方法区,虚拟机栈,本地方法栈,堆和程序计数器。

    程序计数器

    程序计数器可以看做是当前线程所执行的字节码的行号指示器。 每条线程都有一个独立的程序计数器。

    阅读全文

    JAVA数组和容器

    • java中数组的大小是固定的,如果想使用自动分配内存的ArrayList,会使得效率降低。效率是考虑使用数组的唯一原因,否则使用容器会好很多。

    • 数组是一个对象,数组的标识符是一个引用。对象数组和基本类型数组的区别是对象数组保存的是引用,而基本类型数组保存的是值。

    阅读全文

    汉诺塔问题

    很典型的递归问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int i = 1;
    void move(int n, char from, char to) {
    cout<<"第"<<i++<<"步:将盘子从"<<from<<"移动到"<<to<<endl;
    }
    void hanoi(int n, char from, char by, char to) {
    if (n == 1) {
    move(1, from, to);
    } else {
    hanoi(n - 1, from, to, by);
    move(1, from, to);
    hanoi(n - 1, by, from, to);
    }
    }

    阅读全文

    Single Number总结

    HashTable

    最简单的是使用Hash表,暂且按下不表。

    位操作

    对于Single Number,可以很简单的使用异或操作完成:

    阅读全文

    c++中stringstream处理字符串问题

    Simplify Path

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class Solution {
    public:
    string simplifyPath(string path) {
    string res, tmp;
    vector<string> stk;
    stringstream ss(path);
    while(getline(ss, tmp, '/')) {
    if (tmp == "" or tmp == ".") continue;
    if (tmp == ".." and !stk.empty()) stk.pop_back();
    else if (tmp != "..") stk.push_back(tmp);
    }
    for(auto str : stk) res += "/"+str;
    return res.empty() ? "/" : res;
    }
    };

    阅读全文

    LeetCode: Partition List

    在这种解法中,用到了两个节点来分别记录两个部分的节点的相互关系,很简单明了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    /**
    * Definition for singly-linked list.
    * struct ListNode {
    * int val;
    * ListNode *next;
    * ListNode(int x) : val(x), next(NULL) {}
    * };
    */
    class Solution {
    public:
    ListNode* partition(ListNode* head, int x) {
    ListNode node1(0), node2(0);
    ListNode *p1 = &node1, *p2 = &node2;
    while (head) {
    if (head->val < x)
    p1 = p1->next = head;
    else
    p2 = p2->next = head;
    head = head->next;
    }
    p2->next = NULL;
    p1->next = node2.next;
    return node1.next;
    }
    };

    阅读全文

    双指针问题的总结

    链表的双指针问题

    有环无环的问题

    判断一个链表有没有环的方法一般是使用一个慢指针和一个快指针,慢指针一次走一步,快指针一次走两步,这样如果链表有环的话,快慢指针是会相遇的。

    阅读全文

    动态规划的一些总结

    ##滚动数组的使用

    平时我们做题时一般是使用一个和原问题规模大小的数组来存储中间的结果值,但是,如果我们仔细看递推公式可以发现,有时我们是可以降低dp数组的的大小的。比如一些问题我们需要申明m*n大小的数组,但是我们可以重复使用一个大小为n的数组来解决问题。

    阅读全文