头像

跟着xc学编程




离线:6个月前



跟着xc学编程
2020-02-14 07:07

下面是代码。
class Solution {
public:
int strToInt(string str) {
if(str.size() == 0){ //如果字符串为空,直接返回。
return 0;
}
long int res = 0;//用来保存返回值。一定要位long int,可能16位的int不会编译通过。
int flag = 0; //这个flag用来标记有没有符号位。没有0,+:1,-:2.
int i = 0; //这个指针用来记录第一个非空位置。

    //得到第一个非空的字符的位置。
    while(str[i] == ' ') 
        i++;

    //判断第一个非空字符是不是符号位。
    if(str[i] == '+') flag = 1;
    if(str[i] == '-') flag = 2;

    //得到第一个数字的位置。也就是符号位之后的那个数字。
    int start = flag > 0? (i+1): i;

    //进行遍历。
    while(start < str.size()){

        //如果当前的不是数字,后面的也不再循环。
        if(str[start] > '9' || str[start] < '0'){
            break;
        }

        //累加得到的结果。用str[str] - '0'将字符更改为数字。
        res = res*10 + str[start] - '0';
        start ++ ;
    }

    //为了判断最后是不是超过了表示范围。再次保存一个临时结果变量。
    long int res2 = flag>1?-res:res;

    //判断结果。如果没有受限,则返回res2.
    if(res2 > INT_MAX) return INT_MAX;
    if(res2 < INT_MIN) return INT_MIN;
    return res2;

}

};




跟着xc学编程
2019-12-15 13:10

/
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode
left;
* TreeNode
right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:

// Encodes a tree to a single string.
string serialize(TreeNode* root) {
    string res;
    dfs_s(root, res);
    return res;
}

void dfs_s(TreeNode* root, string &res){
    if(!root) {
        res += "null ";//如果当前节点为空,保存null和一个空格
        return ;
    }
    res += to_string(root->val) + ' ';//如果当前节点不为空,保存数字和一个空格
    dfs_s(root->left, res);
    dfs_s(root->right, res);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
    int u = 0;  //用来保存当前的字符串遍历的位置
    return dfs_d(data, u);
}

TreeNode* dfs_d(string data, int &u){//这里的u是传的引用,不是值传递
    if (u == data.size()) return NULL;  //如果已经达到了字符串的尾端,则退出。
    int k = u;
    while(data[k] != ' ') k++; //k记录当前数字的位数如134是个三位数的数字,56是个两位数的数字,退出的时候,k指向了字符的中间的空格,所以回到下个字符的首部需要加1.

    if(data[u] == 'n') {//如果当前字符串是“null”
        u = k+1;//回到下一个数字的首部,注意是u = k+1, 不是u = u+1;
        return NULL;//表示这次构造的是一个null节点,并没有孩子节点,所以跳过后面的递归
    }
    int val = 0;
    //如果数字是负的
    if(data[u] == '-'){
         for (int i = u+1; i < k; i++) val = val * 10 + data[i] - '0';
         val  = -val;
    }
    else{
    //如果是数字是正的
        for (int i = u; i < k; i++) val = val * 10 + data[i] - '0';
    }
    u = k + 1;//回到下个数字的首部
    //递归算法总是先写退出条件,然后才递归调用。
    auto root = new TreeNode(val);
    root->left = dfs_d(data, u);
    root->right = dfs_d(data, u);
    return root;
}

};