这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战
1935. 可以输入的最大单词数
思路分析
这道题的逻辑就是判断每个单词中是否包含损坏的单词,可以使用字符串find函数来查询。但是这样会增加时间复杂度,所以这里我们将键盘损坏的字母键存入数组中。接下来是每个单词的判断,虽然可以按照空格分为多个单词数组,所以可以利用单空格的条件计数
int ret = 0;
int tmp = 0;
for(int i = 0; i < text.size(); i ++){
if( text[i] == ' '){
if (tmp == 0)ret++;
tmp = 0;
}else{
if(arr[text[i] - 'a'] != 0){
tmp = 1;
}
}
}
if (tmp == 0)ret++;
return ret;
今天力扣官网不知道为什么崩了,我也没有存稿,所以写一道acwing
18. 重建二叉树
思路分析
这道题在考研中经常做选择,根据前序序列和中序序列推断后序序列(也可能是其他的两个推断一个)。
以这题为例,在中序的对应前序的第一个节点的点的左边,一定是左子树,右边一定是右子树,这个是我们做题之前先明确的。 假设左子树的中序遍历的长度是 l,则在前序遍历中,根节点后面的 l 个数,是左子树的节点。剩下的数是右子树的节点。 以此类推,不断递归,求出左右子树,再创建根结点。
TreeNode* dfs(vector<int>&pre, vector<int>&in, int pl, int pr, int il, int ir) {
if (pl > pr) return NULL;
int k = pos[pre[pl]] - il;
TreeNode* root = new TreeNode(pre[pl]);
root->left = dfs(pre, in, pl + 1, pl + k, il, il + k - 1);
root->right = dfs(pre, in, pl + k + 1, pr, il + k + 1, ir);
return root;
}