762. 二进制表示中质数个计算置位 / 剑指 Offer 46. 把数字翻译成字符串 / 1873. 计算特殊奖金 / 627. 变更性别 / 196. 删除重复的电子邮箱

762. 二进制表示中质数个计算置位【简单题】【每日一题】

思路:【官解方法二】

看到方法二人呆了,还能这么玩~

  1. 统计区间中,二进制表示的1的个数是质数的情况,区间右端点最大为10的6次方,小于2的19次方,也就是说,要统计的区间中,二进制表示中1的个数最大不会超过19个,那我就给你拉满,就按19个算。
  2. 小于等于19的质数只有2、3、5、7、11、13、17、19,定义一个二进制表示的数,第2、3、5、7、11、13、17、19位是1,其他位为0,即
    1010 0010 1000 1010 1100,其十进制表示为665772。
  3. 设统计范围内,遍历到的数据,二进制表示中1的个数为n个,那么1左移n位,与65772按位相与,如果结果不为0,说明左移的位数是质数位,说明n是质数,满足题意,则ans++,由此遍历统计区间内所有的数据,判断是否满足题意。遍历结束返回ans即可。

代码:

class Solution {
    public int countPrimeSetBits(int left, int right) {
        int ans = 0;
        for (int i = left; i <= right; i++) {
            if ((1 << Integer.bitCount(i) & 665772) != 0){
                ans++;
            }
        }
        return ans;
    }
}

剑指 Offer 46. 把数字翻译成字符串【中等题】

思路:

  1. 依次遍历每个字符,记录当前字符所能贡献的方案数为f(i)。
  2. 当前字符为单个时,就是在前一个字符的基础上添加一个字符,不额外贡献方案,因此f(i)=f(i-1)
  3. 当前字符与前一个字符组合后依然满足翻译条件时,设这种情况为条件k,额外贡献了一个i-2位置的字符方案。
  4. 于是综合起来,就是 f(i) = f(i-1) + f(i-2) [条件k成立]。
  5. 边界条件为f(0) = 1,f(1) = 1。
  6. 从 i= 1 开始遍历,每次遍历,先更新f(i-2) = f(i-1),f(i-1) = f(i) , 然后对f(i) 进行更新,f (i) = f(i-1) ,判断条件k是否成立,成立则 f(i) += f(i-2) 。
  7. 遍历结束,返回最后一个f(i)即可。

代码:

class Solution {
    public int translateNum(int num) {
        String s = String.valueOf(num);
        //f2 表示 f(i-2)  初值为1
        //f1 表示 f(i-1)  初值为1
        //f  表示 f(i)    初值为1
        //动态转移方程:f = f2 + f1[条件判断成立则加f1,不成立则不加]
        int f2 = 1,f1 = 1,f = 1,len = s.length();
        for (int i = 1; i < len; i++) {
            f2 = f1;//更新f(i-2) = f(i-1)
            f1 = f;//更新f(i-1) = f
            f = f1;//更新f(i)等于f(i-1)
            String pre = s.substring(i-1,i+1);//取出当前i和前一位组成的2位数
            //判断是否能组成新字符 即pre表示的数是否在[10,25]之间
            if (pre.compareTo("25") <= 0 && pre.compareTo("10") >= 0){
                f += f2;//f(i-2)贡献方案数,累加
            }
        }
        return f;
    }
}

1873. 计算特殊奖金【简单题】

在这里插入图片描述

代码:

# Write your MySQL query statement below
# select employee_id,
# if(employee_id % 2 != 0 && name not like 'M%',salary,0)
# as bonus 
# from Employees
# order by employee_id;

select employee_id,
    case
        when employee_id % 2 = 1 && name not like 'M%' then salary
        else 0
    end bonus
from Employees
order by employee_id;

627. 变更性别【简单题】

在这里插入图片描述

代码:

# Write your MySQL query statement below
# update Salary set sex = if(sex = 'f','m','f');

update Salary set sex = 
    case 
        when sex = 'f' then 'm'
        else 'f'
    end;

196. 删除重复的电子邮箱【简单题】

在这里插入图片描述

# Please write a DELETE statement and DO NOT write a SELECT statement.
# Write your MySQL query statement below

DELETE p1 from Person p1,Person p2 
where p1.email = p2.email && p1.id > p2.id;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值