796. 旋转字符串 / 剑指 Offer II 005. 单词长度的最大乘积 / 1965. 丢失信息的雇员 / 608. 树节点 / 176. 第二高的薪水

本文介绍了字符串旋转问题的解决方案,通过检查字符串长度和包含性来判断是否能通过旋转得到目标字符串。此外,还探讨了如何使用位掩码解决单词长度最大乘积的问题,以及在MySQL中处理丢失信息的雇员和查询树节点类型的方法。同时,文章也涉及了在数据库中查找第二高薪水的策略。这些内容涵盖了字符串操作、位运算、SQL查询等多个编程与数据处理的方面。
摘要由CSDN通过智能技术生成

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. 单词长度的最大乘积【中等题】

思路:【位掩码】

  1. 将每个单词由什么字母组成用位掩码来表示,当两个单词位掩码相同时,取长度较大的那个。
  2. 在所有位掩码中两两比较,当位掩码按位与为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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值