leetcode第152周赛

这次第三题有点意思,我忘了还可以这样,失误失误,因为第四题是会的,只是时间不够,不然名次不会只是95

第一题
https://leetcode-cn.com/problems/prime-arrangements/
请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;你需要返回可能的方案总数。
让我们一起来回顾一下「质数」:质数一定是大于 1 的,并且不能用两个小于它的正整数的乘积来表示。
由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。

这道题开始理解错了,后来才理解,就是质数在质数位置上,合数在合数位置上,其实就是质数和合数数目分别A计算,然后相乘

public int numPrimeArrangements(int n) {
	int k = 0;
	for (int i = 2; i <= n; i++) {
		if (zhi(i)) {
			k++;
		}
	}
	long ans = 1;
	for (int i = 1; i <= n-k; i++) {
		ans *= i;
		ans = ans % 1000000007;
	}
	for (int i = 1; i <= k; i++) {
		ans *= i;
		ans = ans % 1000000007;
	}
	return (int) ans;
}

private boolean zhi(int k) {
	for (int i = 2; i <= Math.sqrt(k); i++) {
		if (k % i == 0) {
			return false;
		}
	}
	return true;
}

第二题
https://leetcode-cn.com/problems/diet-plan-performance/
你的好友是一位健身爱好者。前段日子,他给自己制定了一份健身计划。现在想请你帮他评估一下这份计划是否合理。
他会有一份计划消耗的卡路里表,其中 calories[i] 给出了你的这位好友在第 i 天需要消耗的卡路里总量。
计划的统计周期通常是 k 天,你需要计算他在每一段连续的 k 天内消耗的总卡路里 T:
如果 T < lower,那么这份计划相对糟糕,并失去 1 分;
如果 T > upper,那么这份计划相对优秀,并获得 1 分;
否则,这份计划普普通通,分值不做变动。
请返回统计完所有 calories.length 天后得到的总分作为评估结果。
注意:总分可能是负数。

输入:calories = [1,2,3,4,5], k = 1, lower = 3, upper = 3
输出:0
解释:calories[0], calories[1] < lower 而 calories[3], calories[4] > upper, 总分 = 0.

public int dietPlanPerformance(int[] calories, int k, int lower, int upper) {
	int res = 0;
	int ans = 0;
	for (int i = 0; i < k; i++) {
		ans += calories[i];
	}
	if (ans < lower) {
		res--;
	} else if (ans > upper) {
		res++;
	}
	for (int i = k; i < calories.length; i++) {
		ans += calories[i];
		ans -= calories[i - k];
		if (ans < lower) {
			res--;
		} else if (ans > upper) {
			res++;
		}
	}
	return res;
}

第三题
https://leetcode-cn.com/problems/can-make-palindrome-from-substring/
给你一个字符串 s,请你对 s 的子串进行检测。
每次检测,待检子串都可以表示为 queries[i] = [left, right, k]。我们可以 重新排列 子串 s[left], …, s[right],并从中选择 最多 k 项替换成任何小写英文字母。
如果在上述检测过程中,子串可以变成回文形式的字符串,那么检测结果为 true,否则结果为 false。
返回答案数组 answer[],其中 answer[i] 是第 i 个待检子串 queries[i] 的检测结果。
注意:在替换时,子串中的每个字母都必须作为 独立的 项进行计数,也就是说,如果 s[left…right] = “aaa” 且 k = 2,我们只能替换其中的两个字母。(另外,任何检测都不会修改原始字符串 s,可以认为每次检测都是独立的)

输入:s = “abcda”, queries = [[3,3,0],[1,2,0],[0,3,1],[0,3,2],[0,4,1]]
输出:[true,false,false,true,true]
解释:
queries[0] : 子串 = “d”,回文。
queries[1] : 子串 = “bc”,不是回文。
queries[2] : 子串 = “abcd”,只替换 1 个字符是变不成回文串的。
queries[3] : 子串 = “abcd”,可以变成回文的 “abba”。 也可以变成 “baab”,先重新排序变成 “bacd”,然后把 “cd” 替换为 “ab”。
queries[4] : 子串 = “abcda”,可以变成回文的 “abcba”。

这道题就是我说的,数组也可以这么玩?就是求一段的和时候,先求全部和

int[][] ress;

public List<Boolean> canMakePaliQueries(String s, int[][] queries) {
	List<Boolean> res = new ArrayList<Boolean>();
	ress = new int[s.length() + 1][26];
	for (int i = 0; i < s.length(); i++) {
		for (int j = 0; j < 26; j++) {
			ress[i + 1][j] = ress[i][j];
		}
		ress[i + 1][s.charAt(i) - 'a']++;
	}
	for (int i = 0; i < queries.length; i++) {
		res.add(getRes(s, queries[i][0], queries[i][1], queries[i][2]));
	}
	return res;
}

private Boolean getRes(String s, int start, int end, int n) {
	if (n >= 13) {
		return true;
	}
	int k = 0;
	int[] ans = new int[26];

	for (int i = 0; i < ans.length; i++) {
		ans[i] = ress[end + 1][i] - ress[start][i];
	}
	for (int i = 0; i < ans.length; i++) {
		if (ans[i] % 2 != 0) {
			k++;
		}
	}
	return k / 2 <= n;
}

第四题
https://leetcode-cn.com/problems/number-of-valid-words-for-each-puzzle/
外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧。
字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么它就可以算作谜底:
单词 word 中包含谜面 puzzle 的第一个字母。
单词 word 中的每一个字母都可以在谜面 puzzle 中找到。
例如,如果字谜的谜面是 “abcdefg”,那么可以作为谜底的单词有 “faced”, “cabbage”, 和 “baggage”;而 “beefed”(不含字母 “a”)以及 “based”(其中的 “s” 没有出现在谜面中)。
返回一个答案数组 answer,数组中的每个元素 answer[i] 是在给出的单词列表 words 中可以作为字谜迷面 puzzles[i] 所对应的谜底的单词数目。

示例:
输入:
words = [“aaaa”,“asas”,“able”,“ability”,“actt”,“actor”,“access”],
puzzles = [“aboveyz”,“abrodyz”,“abslute”,“absoryz”,“actresz”,“gaswxyz”]
输出:[1,1,3,2,4,0]
解释:
1 个单词可以作为 “aboveyz” 的谜底 : “aaaa”
1 个单词可以作为 “abrodyz” 的谜底 : “aaaa”
3 个单词可以作为 “abslute” 的谜底 : “aaaa”, “asas”, “able”
2 个单词可以作为 “absoryz” 的谜底 : “aaaa”, “asas”
4 个单词可以作为 “actresz” 的谜底 : “aaaa”, “asas”, “actt”, “access”
没有单词可以作为 “gaswxyz” 的谜底,因为列表中的单词都不含字母 ‘g’。

提示:
1 <= words.length <= 10^5
4 <= words[i].length <= 50
1 <= puzzles.length <= 10^4
puzzles[i].length == 7
words[i][j], puzzles[i][j] 都是小写英文字母。
每个 puzzles[i] 所包含的字符都不重复。

重要的是,puzzles[i].length == 7这个提示,这样我就可以把谜底的所有可能(int值)列出来

Map<Integer, Integer> scoreMap = new HashMap<Integer, Integer>();

public List<Integer> findNumOfValidWords(String[] words, String[] puzzles) {
	for (int i = 0; i < words.length; i++) {
		int score = getScore(words[i]);
		int value = 1;
		if (scoreMap.containsKey(score)) {
			value += scoreMap.get(score);
		}
		scoreMap.put(score, value);
	}
	List<Integer> res = new ArrayList<Integer>();
	for (int i = 0; i < puzzles.length; i++) {
		res.add(getAns(puzzles[i]));
	}
	return res;
}

private int getScore(String word) {
	int ans = 0;
	for (int i = 0; i < word.length(); i++) {
		ans |= 1 << (word.charAt(i) - 'a');
	}
	return ans;
}

private int getAns(String puzz) {
	int ans = 0;
	int key = 1 << (puzz.charAt(0) - 'a');
	for (int i = 0; i < (1 << (puzz.length() - 1)); i++) {
		int k = key;
		for (int j = 1; j < puzz.length(); j++) {
			if ((i & (1 << (j - 1))) != 0) {
				k += (1 << (puzz.charAt(j) - 'a'));
			}
		}
		if (scoreMap.containsKey(k)) {
			ans += scoreMap.get(k);
		}
	}
	return ans;
}

leetcode的一些已经写的觉得有意思的其他题目
https://blog.csdn.net/qq_33321609/article/category/9012437
如果有我没有写博客的其他题目需要讨论,欢迎评论,一起探讨

发布了127 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_33321609/article/details/100190051
今日推荐