备战复试,每日三题
题目一: 比特位计数
给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
示例 1:
输入:n = 2
输出:[0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
示例 2:
输入:n = 5
输出:[0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
提示:
0 <= n <= 105
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/counting-bits
动态规划思想;二进制表示中常用的一个思想:i&(i-1)
class Solution {
public:
vector<int> countBits(int n) {
vector<int> nums(n+1);
//起始条件
nums[0]=0;
for(int i=1;i<n+1;i++){
//当前数字的二进制表示中1的个数依赖于前一项1的个数
//i与i-1中1的个数要么相差1,要么i中只有一个1(如100与011,相与为0,即nums[0]=0,0+1=1)
nums[i]=nums[i&(i-1)]+1;
}
return nums;
}
};
题目二: 判断子序列
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
进阶:
如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
致谢:
特别感谢 @pbrother 添加此问题并且创建所有测试用例。
示例 1:
输入:s = “abc”, t = “ahbgdc”
输出:true
示例 2:
输入:s = “axc”, t = “ahbgdc”
输出:false
提示:
0 <= s.length <= 100
0 <= t.length <= 10^4
两个字符串都只由小写字符组成。
通过次数163,757提交次数316,619
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/is-subsequence
class Solution {
public:
bool isSubsequence(string s, string t) {
int i=0,j=0;
while(i<s.length()&&j<t.length()){
if(s[i]==t[j]){
i++;
}
j++;
}
if(i==s.length()){
return true;
}else{
return false;
}
}
};
题目三: 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
示例 2:
输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。
示例 3:
输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。
提示:
树中节点的数目在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-sum
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==nullptr) return false;
if(root->left!=nullptr&&root->right!=nullptr){
return hasPathSum(root->left,targetSum-root->val)||hasPathSum(root->right,targetSum-root->val);
}else if(root->left==nullptr&&root->right!=nullptr){
return hasPathSum(root->right,targetSum-root->val);
}else if(root->right==nullptr&&root->left!=nullptr){
return hasPathSum(root->left,targetSum-root->val);
}else if(targetSum==root->val){
return true;
}else{
return false;
}
}
};