762. 二进制表示中质数个计算置位【简单题】【每日一题】
思路:【官解方法二】
看到方法二人呆了,还能这么玩~
- 统计区间中,二进制表示的1的个数是质数的情况,区间右端点最大为10的6次方,小于2的19次方,也就是说,要统计的区间中,二进制表示中1的个数最大不会超过19个,那我就给你拉满,就按19个算。
- 小于等于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。- 设统计范围内,遍历到的数据,二进制表示中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. 把数字翻译成字符串【中等题】
思路:
- 依次遍历每个字符,记录当前字符所能贡献的方案数为f(i)。
- 当前字符为单个时,就是在前一个字符的基础上添加一个字符,不额外贡献方案,因此f(i)=f(i-1)
- 当前字符与前一个字符组合后依然满足翻译条件时,设这种情况为条件k,额外贡献了一个i-2位置的字符方案。
- 于是综合起来,就是 f(i) = f(i-1) + f(i-2) [条件k成立]。
- 边界条件为f(0) = 1,f(1) = 1。
- 从 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) 。
- 遍历结束,返回最后一个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;