leetcode 0214
Posted Paulkg12
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 0214相关的知识,希望对你有一定的参考价值。
目录
✅ 965. 单值二叉树
https://leetcode-cn.com/problems/univalued-binary-tree/
描述
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
解答
c++
/**
* 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:
bool isUnivalTree(TreeNode* root) {
int markfirst = root->val;
std::queue<TreeNode* > q;
q.push(root);
while(!q.empty()){
TreeNode* tmp = q.front();
if (tmp->val != markfirst) return false;
else {
q.pop();
if(tmp->left != NULL){
q.push(tmp->left);
}
if(tmp->right != NULL){
q.push(tmp->right);
}
}
}
return true;
}
};
/*执行用时 :
12 ms
, 在所有 C++ 提交中击败了
30.77%
的用户
内存消耗 :
10.7 MB
, 在所有 C++ 提交中击败了
26.52%
的用户*/
updated dfs c++
/**
* 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:
bool dfs(TreeNode *root, int val) {
if(!root){
return true;
}
if(root->val != val) return false;
return dfs(root->left, val) && dfs(root->right, val);
}
bool isUnivalTree(TreeNode* root) {
if(!root) return true;
int mark1st = root->val;
return dfs(root, mark1st);
}
};
/*执行用时 :
8 ms
, 在所有 C++ 提交中击败了
30.77%
的用户
内存消耗 :
10.7 MB
, 在所有 C++ 提交中击败了
9.98%
的用户*/
py
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def __init__(self):
self.res = set()
def isUnivalTree(self, root: TreeNode) -> bool:
if root is None:
return
self.res.add(root.val)
self.isUnivalTree(root.left)
self.isUnivalTree(root.right)
return len(self.res) == 1
\'\'\'
执行用时 :
28 ms
, 在所有 Python3 提交中击败了
93.25%
的用户
内存消耗 :
13 MB
, 在所有 Python3 提交中击败了
46.72%
的用户
\'\'\'
py 生成器
生成器大法好
class Solution(object):
def isUnivalTree(self, root):
root = iterable(root)
return len(set(root)) == 1
def iterable(p):
if p:
yield p.val
yield from iterable(p.left)
yield from iterable(p.right)
✅ 762. 二进制表示中质数个计算置位
https://leetcode-cn.com/problems/prime-number-of-set-bits-in-binary-representation/
描述
给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数。
(注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。)
示例 1:
输入: L = 6, R = 10
输出: 4
解释:
6 -> 110 (2 个计算置位,2 是质数)
7 -> 111 (3 个计算置位,3 是质数)
9 -> 1001 (2 个计算置位,2 是质数)
10-> 1010 (2 个计算置位,2 是质数)
解答
cpp other
class Solution {
public:
int countPrimeSetBits(int L, int R) {
int count = 0;
for (int i = L;i <= R;i++) {
if (isPrime(countCore(i))) count++;
}
return count;
}
int countCore(int num) {
int count = 0;
while (num) {
num &= (num - 1);
count++;
}
return count;
}
bool isPrime(int num) {
if (num == 2) return true;
// 除2以外的其余偶数
if (num == 1 || (num & 0x1) == 0) return false;
for (int i = 3;i <= sqrt(num);i+=2) {
if (num % i == 0) return false;
}
return true;
}
};
---
class Solution {
public:
int countPrimeSetBits(int L, int R) {
set<int>prime_num = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
int cnt = 0;
for(int i=L; i<=R; i++)
{
bitset<32>num(i);
if(prime_num.count(num.count()) == 1)
cnt ++;
}
return cnt;
}
};
cpp mine
class Solution {
public:
int countPrimeSetBits(int L, int R) {
set<int> allThePrimeNums = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
int cnt = 0;
for (int i = L; i <= R; i++) {
bitset<32> num(i);
if(allThePrimeNums.count(num.count()) == 1) cnt++;
}
return cnt;
}
};
/*执行用时 :
16 ms
, 在所有 C++ 提交中击败了
70.86%
的用户
内存消耗 :
8.7 MB
, 在所有 C++ 提交中击败了
5.47%
的用户*/
java isPrime
高效写法,copy me!
private boolean isPrimeNum(int i) {
for (int j = i == 2 ? 3 : 2; j <= Math.sqrt(i) + 1; j++) {
if (i % j == 0) return false;
}
return true;
}
py
class Solution:
def countPrimeSetBits(self, L: int, R: int) -> int:
temp = [2, 3, 5, 7, 11, 13, 17, 19]
return len([i for i in range(L, R+1) if bin(i).count(\'1\') in temp])
\'\'\'
执行用时 :
248 ms
, 在所有 Python3 提交中击败了
73.46%
的用户
内存消耗 :
13.1 MB
, 在所有 Python3 提交中击败了
52.38%
的用户
\'\'\'
✅ 1047. 删除字符串中的所有相邻重复项
https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
描述
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
解答
c++ other
class Solution {
public:
string removeDuplicates(string S) {
int top = 0;
for (char ch : S) {
if (top == 0 || S[top - 1] != ch) {
S[top++] = ch;
} else {
top--;
}
}
S.resize(top);
return S;
}
};
// 模拟一遍了,发现真NB ⬆️
// copy me ⬇️ todo 0214
class Solution {
public:
string removeDuplicates(string S) {
deque<char> q;
for(int i=0;i<S.size();i++){
if(!q.empty()&&q.back()==S[i])
q.pop_back();
else
q.push_back(S[i]);
}
string ans = "";
while(!q.empty())
{
ans.push_back(q.front());
q.pop_front();
}
return ans;
}
};
py
\'\'\'
方法一:替换函数
我们可以用字符串自带的替换函数,由于字符串仅包含小写字母,因此只有 26 种不同的重复项。
将 aa 到 zz 的 26 种重复项放入集合中;
遍历这 26 种重复项,并用字符串的替换函数把重复项替换成空串。
注意,在进行过一次替换之后,可能会出现新的重复项。例如对于字符串 abbaca,如果替换了重复项 bb,字符串会变为 aaca,出现了新的重复项 aa。因此,上面的过程需要背重复若干次,直到字符串在一整轮替换过程后保持不变(即长度不变)为止。
\'\'\'
from string import ascii_lowercase
class Solution:
def removeDuplicates(self, S: str) -> str:
# generate 26 possible duplicates
duplicates = {2 * ch for ch in ascii_lowercase}
prev_length = -1
while prev_length != len(S):
prev_length = len(S)
for d in duplicates:
S = S.replace(d, \'\')
return S
\'\'\'
方法二:栈
我们可以用栈来维护没有重复项的字母序列:
若当前的字母和栈顶的字母相同,则弹出栈顶的字母;
若当前的字母和栈顶的字母不同,则放入当前的字母。
\'\'\'
class Solution:
def removeDuplicates(self, S: str) -> str:
output = []
for ch in S:
if output and ch == output[-1]:
output.pop()
else:
output.append(ch)
return \'\'.join(output)
模仿上面的py 的c++ 代码出错了:todo 0214
到底是 不会很精确的c++ api
#include <algorithm>
class Solution {
public:
string removeDuplicates(string S) {
stack<char> ss;
for(char ch: S) {
if(&ss != NULL && (ch == ss.top())) {
ss.pop();
}
else {
ss.push(ch);
}
}
char *ret = "";
int i = 0;
printf("ss size: %d", ss.size());
while(!ss.empty()){
if(ss.top()){
ret[i++] = ss.pop();
}
}
ret[i] = \'\\0\';
reverse(ret[0], ret[i-1]);
return ret;
}
};
/*编译出错solution.cpp: In member function removeDuplicates
Line 19: Char 33: error: void value not ignored as it ought to be
ret[i++] = ss.pop();
^*/
✅ 171. Excel表列序号(26进制转10进制)
https://leetcode-cn.com/problems/excel-sheet-column-number/
描述
给定一个Excel表格中的列名称,返回其相应的列序号。
例如,
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
示例 1:
输入: "A"
输出: 1
示例 2:
输入: "AB"
输出: 28
解答
26进制转10进制
c
class Solution {
public:
int titleToNumber(string s) {
int ret = 0;// you must init local var to 0; while global var can auto init to 0
for (int i = 0; i < s.size(); i++) {
ret = ret * 26 + (s[i] - \'A\' + 1);
}
return ret;
}
};
java
py
class Solution:
def titleToNumber(self, s: str) -> int:
ans = 0;
for ch in s:
ans *= 26;
ans += ord(ch) - ord(\'A\') + 1
return ans
\'\'\'
几秒前 通过 36 ms 13.1 MB Python3
几秒前 通过 4 ms 8.2 MB Cpp
\'\'\'
以上是关于leetcode 0214的主要内容,如果未能解决你的问题,请参考以下文章
leetcode_1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold_[二维前缀和](代码片段
LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段