一、质数排列(LeetCode-1175)

1.1 题目描述

1.2 解题思路

先统计出1-n中有多少个质数,得到质数个数\(x\),剩下的数\(y = n - x\);

使用排列组合公式得出结果

\(A_x^x A_y^y\)

1.3 解题代码



private static final long INF = 1000000007;

    public int numPrimeArrangements(int n) {

        int count = countPrime(n);
//剩余位数
int other = n - count;
long res = 1;
for (int i = 1; i <= count; i++) {
res *= i;
if(res > INF) res%=INF;
}
for (int i = 1; i <= other; i++) {
res *= i;
if(res > INF) res%=INF;
} return (int) res;
} /**
* 判断n个数中有多少个质数
*
* @param n
* @return
*/
private int countPrime(int n) {
int count = 0;
for (int i = 2; i <= n; i++) {
if (isPrime(i)) {
++count;
}
}
return count;
} /**
* 判断是否是质数
*
* @param n
* @return
*/
private boolean isPrime(int n) {
if(n == 1){
return false;
}
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}

二、健身计划评估(LeetCode-5174)

2.1 题目描述

2.2 解题思路

非常简单的一道题,理解清楚题意就好。只要是连续的k天,都可以。

2.3 解题代码


public class Solution { public int dietPlanPerformance(int[] calories, int k, int lower, int upper) { int res = 0;
int len = calories.length;
OK:
for (int i = 0; i < len; i++) {
int sum = 0;
if (i + k > len) {
continue OK;
}
for (int j = 0; j < k; j++) {
sum += calories[i + j];
}
if (sum > upper) {
res++;
}
if (sum < lower) {
res--;
} }
return res;
} }

三、构建回文串检测(LeetCode-5175)

3.1 题目描述

3.2 解题思路

注意审题,可以对子串进行重新排序。

思路1:所有可以统计子串中字符出现的次数。(超时)

思路2:使用动态规划的思想,定义dict[n][t],dict[3][4]表示从第0个字符,到第3个字符的子串,第5个字符e的个数。(超时)

思路3:使用位运算的思想,只关心每个字符是奇数或偶数,定义dict[n],表示0-n的子字符串的异或运算结果。

例如:

abc的位异或运算结果为1+2+4 = 7。

abca = 1+2+4 -1 = 2+4 = 6

公式为

bitArray[i] = 1 << (strDict[i] - 'a');
if (i > 0) {
bitArray[i] ^= bitArray[i - 1];
}

最后统计子字符串异或结果中1的个数。

公式为

while (sum != 0) {
sum &= (sum - 1);
count++;
}

3.3 解题代码

思路1:下面的提交,会提示超时。



public class Solution {

    public List<Boolean> canMakePaliQueries(String s, int[][] queries) {

        List<Boolean> res = new ArrayList<>(queries.length);

        for (int i = 0; i < queries.length; i++) {
int left = queries[i][0];
int right = queries[i][1] + 1;
String subStr = s.substring(left, right);
res.add(isAlindrome(subStr, right - left, queries[i][2]));
} return res;
} private boolean isAlindrome(String str, int len, int k) {
if (k >= 13) {
return true;
}
if (len == 1 || len / 2 <= k) {
return true;
}
int[] z = new int[26];
for (int i = 0; i < len; i++) {
z[str.charAt(i) - 'a']++;
}
int diff = 0;
for (int i = 0; i < 26; i++) {
if (z[i] > 0 && z[i] % 2 != 0) {
diff++;
}
}
if (diff / 2 <= k) {
return true;
}
return false;
} }

思路2:提交仍然会超时


public class Solution2 { public List<Boolean> canMakePaliQueries(String s, int[][] queries) {
int len = s.length();
List<Boolean> res = new ArrayList<>(len); int[][] dict = new int[len][26];
char[] strDict = s.toCharArray();
for (int i = 0; i < len; i++) {
if (i > 0) {
dict[i] = dict[i - 1].clone();
}
dict[i][strDict[i] - 'a']++;
} for (int i = 0; i < queries.length; i++) {
int left = queries[i][0];
int right = queries[i][1];
int k = queries[i][2];
int diff = 0; for (int j = 0; j < 26; j++) {
if (left == 0) {
if ((dict[right][j] & 1) != 0) {
diff++;
}
} else {
if (((dict[right][j] - dict[left - 1][j]) & 1) != 0) {
diff++;
}
}
}
res.add(diff / 2 <= k);
}
return res; } }

思路3:可以AC


public class Solution3 { public List<Boolean> canMakePaliQueries(String s, int[][] queries) { int len = s.length();
List<Boolean> res = new ArrayList<>(len); int[] bitArray = new int[len];
char[] strDict = s.toCharArray();
for (int i = 0; i < len; i++) {
bitArray[i] = 1 << (strDict[i] - 'a');
if (i > 0) {
bitArray[i] ^= bitArray[i - 1];
}
} for (int i = 0; i < queries.length; i++) {
int left = queries[i][0];
int right = queries[i][1];
int k = queries[i][2];
//子串各个位之和
int sum = 0;
if (left == 0) {
sum = bitArray[right];
} else {
sum = bitArray[right] ^ bitArray[left - 1];
}
//计算子串的位中有多少个1
int count = 0;
//k <= count/2 等价于 2*k + 1 <= count
k = 2 * k + 1;
boolean ok = true;
while (sum != 0) {
sum &= (sum - 1);
count++;
if (count > k) {
ok = false;
break;
}
}
res.add(ok);
} return res;
} }

LeetCode 第 152 场周赛的更多相关文章

  1. LeetCode第152场周赛(Java)

    这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...

  2. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

  3. Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...

  4. Leetcode 第133场周赛解题报告

    今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...

  5. LeetCode第151场周赛(Java)

    这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...

  6. Leetcode 第137场周赛解题报告

    今天的比赛的题目相对来说比较「直白」,不像前几周都是一些特定的算法,如果你没学过不可能想出来. 做了这些周,对leetcode比赛的题目也发现了一些「规律」. 一般前两道题都很「简单」,只要有想法,直 ...

  7. LeetCode 第 150 场周赛

    一.拼写单词(LeetCode-1160) 1.1 题目描述 1.2 解题思路 由于给定的chars,每个字母只能用一次,所以用大小为26的数组charsArray来表示a-z(例如charsArra ...

  8. LeetCode 第 196 场周赛 (题目:5452-5455,这是参加过最坑的周赛,暴力n^2居然可以过)

    5452. 判断能否形成等差数列   给你一个数字数组 arr . 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 . 如果可以重新排列数组形成等差数列,请返回 tru ...

  9. Leetcode 第136场周赛解题报告

    周日的比赛的时候正在外面办事,没有参加.赛后看了下题目,几道题除了表面要考的内容,还是有些能发散扩展的地方. 做题目不是最终目的,通过做题发现知识盲区,去研究学习,才能不断提高. 理论和实际是有关系的 ...

随机推荐

  1. vue创建组件的几种方法

    <html> <head> <title>vue创建组件</title> <meta charset="utf-8"> ...

  2. laravel登录后其他页面拿不到登录信息

    登录本来是用表单的,我自作聪明的使用ajax提交 public function login(Request $request){ $data = $request->input(); $dat ...

  3. lumen生成key

    在Lumen控制台运行php artisan key:generate提示: $ php artisan key:generate [Symfony\Component\Console\Excepti ...

  4. Django组件之modelform

    Django的model form组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样 ...

  5. linux reboot ,shutdown,halt区别

    reboot ,shutdown,halt区别 重启   reboot  和 shutdown -r now  效果是一样的都是重启 区别在于reboot 是重启时,删除所有的进程,为不是平稳的终止他 ...

  6. unity协程要点

    使用协程做计时功能应注意 1.协程中用到的组件,变量等被置空前,应该将协程置空 2.置空协程之前应停止协程 3.为了确保同一个协程同时只运行一次,可在协程开始前添加安全代码:判断改协程是否存在,存在则 ...

  7. .NET Core 初体验

    .NET Core 作为微软的开源项目,neter 们对之的期待还是挺大的. 以前也看过,接触过,摸索建了几个示例项目,今天就罗列下自己的初体验. .NET Core 安装.帮助等 安装的话,直接官网 ...

  8. m_strcpy

    自己实现strcpy函数 #include <stdio.h> #include <assert.h> //如果它的条件返回错误,则终止程序执行 char *m_strcpy( ...

  9. 回调函数(callback)

    回调函数(callback) A "callback" is any function that is called by another function which takes ...

  10. 【VS Code】中node.js代码自动补全的方法

    原文链接: https://blog.csdn.net/qq_39189819/article/details/91347484