题目链接: Leetcode Weekly Contest 238
写在前面:
本次只做出了第一道,第三道一直到比赛结束也没有做对。
1、1837. Sum of Digits in Base K
难度:Easy
题目大意:
将十进制数n转成k进制,然后返回k进制数每一位数字相加之和。
思路:
按题意模拟即可。
代码
class Solution {
public int sumBase(int n, int k) {
int res=0;
while(n>0){
int value=1;
int count=0;
while(value<=n){
value*=k;
}
value/=k;
int a=n/value;
n-=a*value;
res+=a;
}
return res;
}
}
2、1838. Frequency of the Most Frequent Element
难度:Medium
题目大意:
给出一个数组,以及数字k,每次操作可以将数组汇总一个元素加一,最多可以进行k次操作,求最终数组中最多有几个相同的元素。
思路:
参考高赞回答,先将数组按升序排序,然后遍历每一个元素,假设数组中数目最多的元素就是当前遍历的元素,然后检查是否能将比它小的元素都变成它。采用滑动窗口。
代码
class Solution {
public int maxFrequency(int[] nums, int k) {
Arrays.sort(nums);
int i=0;
long sum=0;//用int会溢出
int res=1;
for(int j=0;j<nums.length;j++){
sum+=nums[j];
while(i<=j&&sum+k<(long)(nums[j]*(j-i+1))){
//将所有的元素都变成nums[j],j-i+1为nums[j]可能的最多个数
sum-=nums[i];
i++;
}
res=Math.max(res,j-i+1);
}
return res;
}
}
3、1839. Longest Substring Of All Vowels in Order
难度:Medium
题目大意:
详见题目。
思路:
参考高赞回答,遍历整个字符串,然后加入一些判断即可。
代码
class Solution {
public int longestBeautifulSubstring(String word) {
char[] s=word.toCharArray();
int n=word.length();
int res=0;
int curLen=1;
int unique=1;//不同字符的个数
for(int i=1;i<n;i++){
if(s[i]>s[i-1]){
curLen++;
unique++;
}
else if(s[i]==s[i-1]){
curLen++;
}
else{
curLen=1;
unique=1;
}
if(unique==5){
res=Math.max(res,curLen);
}
}
return res;
}
}
4、1840. Maximum Building Height
难度:Hard
题目大意:
详见题目。
思路
参考高赞回答,先根据题意求出有限制的位置的建筑物的最高高度是多少,然后求每两个相邻的有限制的位置中间建筑物的最高高度,最后取最大值即可。
代码
class Solution {
public int maxBuilding(int n, int[][] restrictions) {
int size=restrictions.length;
int[][] arr=new int[size+2][2];
for(int i=0;i<size;i++){
arr[i]=restrictions[i];
}
arr[size]=new int[]{1,0};//坐标为1的建筑高度为0
arr[size+1]=new int[]{n,n-1};//坐标为n的建筑高度最高位n-1
Arrays.sort(arr,(a,b)->a[0]-b[0]);
int len=arr.length;
for(int i=1;i<len;i++){//从左到右计算每个位置建筑的最高高度
arr[i][1]=Math.min(arr[i][1],arr[i-1][1]+(arr[i][0]-arr[i-1][0]));
}
for(int i=len-2;i>=0;i--){//从左到右计算每个位置建筑的最高高度
arr[i][1]=Math.min(arr[i][1],arr[i+1][1]+(arr[i+1][0]-arr[i][0]));
}
int ans=0;
for(int i=1;i<len;i++){
int l=arr[i-1][0],r=arr[i][0];
int h1=arr[i-1][1],h2=arr[i][1];
ans=Math.max(ans,Math.max(h1,h2)+(r-l-Math.abs(h1-h2))/2);
//Math.max(h1,h2)+(r-l-Math.abs(h1-h2))/2表示在坐标l和r之间楼层的最高高度
//r-l表示在从l到r可以增加的高度,因为相邻的楼层高度相差不能超过1,所以每次最多将高度增加1
//Math.abs(h1-h2)表示吧h1和h2变得一样高需要增加的高度,可以结合图形来理解
}
return ans;
}
}