796. 旋转字符串【简单题】【每日一题】
思路:
首先判断两个字符串长度是否相等,如果不相等直接返回false。
然后判断s是否可以通过旋转变成goal,模拟一次次的将s中每一个字符移到右边,最极限的情况就是将s中所有的字符都往右移,这样与原来的s形成了一个新字符串
s+s
,如果s可以通过旋转变成goal,那么goal必然在字符串s+s
中,这个操作可以交给String的contains函数,来判断字符串s+s
中是否有一段字符串片段等于goal。
代码:
class Solution {
public boolean rotateString(String s, String goal) {
return s.length() == goal.length() && (s + s).contains(goal);
}
}
剑指 Offer II 005. 单词长度的最大乘积【中等题】
思路:【位掩码】
- 将每个单词由什么字母组成用位掩码来表示,当两个单词位掩码相同时,取长度较大的那个。
- 在所有位掩码中两两比较,当位掩码按位与为0时,说明两个单词完全没有字母重合,符合题意,将两个单词的长度相乘,与max比较并判断是否更新max,遍历完之后返回max即为答案。
class Solution {
public int maxProduct(String[] words) {
Map<Integer,Integer> map = new HashMap<>();
//每个单词都有一个唯一对应的位掩码
for (String word : words) {//把所有单词用掩码形式表示,并存进hashmap
int mask = 0;
int n = word.length();
for (int i = 0; i < n; i++) {
mask |= 1 << (word.charAt(i)-'0');
}
//更新每个掩码所对应的单词长度,保证长度尽可能长
if (n > map.getOrDefault(mask,0)){
map.put(mask,n);
}
}
int max = 0;//定义最大乘积
Set<Integer> keyMask = map.keySet();//定义所有单词的位掩码集合
for (Integer m1 : keyMask) {
int n1 = map.get(m1);
for (Integer m2 : keyMask) {//遍历每一对单词对应的位掩码
if ((m1 & m2) == 0){//只要两个单词有一个字母重合,它们的位掩码按位与之后就不可能为0
//因此可以通过两个位掩码按位与是否为0 来判断两个单词是否有字母重合
int n2 = map.get(m2);
max = Math.max(max,n1*n2);//如果两个单词不重合,就将它们的长度乘积与max比较大小,超过max则将max更新为两个单词长度乘积
}
}
}
return max;
}
}
1965. 丢失信息的雇员【简单题】
代码:
# Write your MySQL query statement below
select e.employee_id from Employees e
left join Salaries s
on e.employee_id = s.employee_id
where s.salary is null
union
select s.employee_id from Salaries s
left join Employees e
on s.employee_id = e.employee_id
where e.name is null
order by employee_id;
608. 树节点【中等题】
代码:
# Write your MySQL query statement below
select id ,
case
when tree.id = (select t.id from tree t where t.p_id is null)
then 'Root'
when tree.id in (select t.p_id from tree t)
then 'Inner'
else
'Leaf'
end as 'Type'
from
tree
order by id;
176. 第二高的薪水【中等题】
176. 第二高的薪水【中等题】
代码:
# Write your MySQL query statement below
select
ifnull( # 如果第一个参数为null,则返回null,否则返回第一个参数
(select
distinct salary # 去除重复数据
from Employee
order by salary desc # 降序排序
limit 1,1), # 从第2条数据开始取,取1条数据
null
)
as SecondHighestSalary