题目链接: Leetcode Weekly Contest 235
写在前面:
本次周赛难度不大,拼手速,做出了前三道,第四道没有想出来,属于数学题。
1、1816. Truncate Sentence
难度:Easy
题目大意:
字符串中各个单词用空格分隔,返回前k个单词。
思路:
统计空格的个数,注意最后一个单词后面没有空格。
代码
class Solution {
public String truncateSentence(String s, int k) {
StringBuffer sb=new StringBuffer();
int space=0;
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' '){
space++;
if(space==k){
sb.append(s.substring(0,i));
break;
}
}
}
if(space<k){
return s;
}
return sb.toString();
}
}
2、1817. Finding the Users Active Minutes
难度:Medium
题目大意:
详见题目。
思路:
按题目模拟即可。
代码
class Solution {
public int[] findingUsersActiveMinutes(int[][] logs, int k) {
Map<Integer,Set<Integer>> map=new HashMap<>();
for(int[] log:logs){
int id=log[0],minute=log[1];
if(!map.containsKey(id)){
Set<Integer> set=new HashSet<>();
set.add(minute);
map.put(id,set);
}
else{
if(!map.get(id).contains(minute)){
Set<Integer> set=map.get(id);
set.add(minute);
map.put(id,set);
}
}
}
int[] ans=new int[k];
for(Integer n:map.keySet()){
int size=map.get(n).size();
size--;
ans[size]++;
}
return ans;
}
}
3、1818. Minimum Absolute Sum Difference
难度:Medium
题目大意:
详见题目。
思路:
错误思路:
先求出绝对值差最大的数组元素所在的位置,然后暴力,将该位置的元素依次用其它元素代替,找到最小绝对值差。
正确思路:
参考高赞回答,遍历nums1[ ]中的每个元素,看看替换掉该元素结果能获得的降低量,寻找最大的降低量。
代码
class Solution {
public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {
int M=1000000007;
long sum=0;
TreeSet<Integer> set=new TreeSet<>();
for(int i=0;i<nums1.length;i++){
int diff=Math.abs(nums1[i]-nums2[i]);
sum=sum+diff;
set.add(nums1[i]);
}
int maxDcrements=0;
for(int i=0;i<nums1.length;i++){
int diff=Math.abs(nums1[i]-nums2[i]);
Integer ceil=set.ceiling(nums2[i]);
if(ceil!=null){
maxDcrements=Math.max(maxDcrements,diff-Math.abs(nums2[i]-ceil));
}
Integer floor=set.floor(nums2[i]);
if(floor!=null){
maxDcrements=Math.max(maxDcrements,diff-Math.abs(floor-nums2[i]));
}
}
return (int)((sum-maxDcrements)%M);
}
}
4、1819. Number of Different Subsequences GCDs
难度:Hard
题目大意:
求数组子序列最大公约数有多少种可能的取值。
思路
参考高赞回答。是一道数学题。
代码
class Solution {
//如果数组的子序列中所有是q的倍数的元素的最大公约数是q,则q是子序列的最大公约数
public int countDifferentSubsequenceGCDs(int[] nums) {
int[] factor=new int[200001];//factor[i]表示nums[]中所有能整除i的元素的最大公约数
for(int i=0;i<nums.length;i++){
for(int j=1;j*j<=nums[i];j++){
if(nums[i]%j==0){
int x=j;
int y=nums[i]/j;
if(factor[x]==0){
factor[x]=nums[i];
}
else{
factor[x]=gcd(factor[x],nums[i]);
}
if(factor[y]==0){
factor[y]=nums[i];
}
else{
factor[y]=gcd(factor[y],nums[i]);
}
}
}
}
int res=0;
for(int i=1;i<200001;i++){
if(factor[i]==i){
res++;
}
}
return res;
}
public int gcd(int a,int b){//
while(b!=0){
int t=a;
a=b;
b=t%b;
}
return a;
}
}