感觉越打越菜哇~
5384. 拥有最多糖果的孩子
思路:暴力枚举每个孩子现有糖果+额外糖果是否是最大值即可。
class Solution {
public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
List<Boolean> ans=new ArrayList<>();
for(int i=0;i<candies.length;i++) {
boolean flag=true;
int val=candies[i]+extraCandies;
for(int j=0;j<candies.length;j++)
if(candies[j]>val) {
flag=false;
break;
}
ans.add(flag);
}
return ans;
}
}
5385. 改变一个整数能得到的最大差值
思路:暴力两次的x和y即可,注意判断前导0以及修改后的值要为非0值。
class Solution {
public int maxDiff(int num) {
int ans=0;
for(int i=0;i<=9;i++)
for(int j=0;j<=9;j++) {
int res1=work(num,i,j);
if(res1==-1) continue;
for(int ii=0;ii<=9;ii++)
for(int jj=0;jj<=9;jj++) {
int res2=work(num,ii,jj);
if(res2==-1) continue;
ans=Math.max(ans, Math.abs(res1-res2));
}
}
return ans;
}
private int work(int num,int i,int j) {
String s=String.valueOf(num);
StringBuilder ss=new StringBuilder();
for(int k=0;k<s.length();k++) {
if(s.charAt(k)==(char)('0'+i))
ss.append((char)('0'+j));
else
ss.append(s.charAt(k));
}
int val=Integer.valueOf(ss.toString());
if(ss.charAt(0)=='0' || val==0)
return -1;
return val;
}
}
5386. 检查一个字符串是否可以打破另一个字符串
思路:两个字符串按照字典序排序,然后一一比较即可。
class Solution {
public boolean checkIfCanBreak(String s1, String s2) {
char[] a=s1.toCharArray();
char[] b=s2.toCharArray();
int num=0;
Arrays.parallelSort(a);
Arrays.parallelSort(b);
for(int i=0;i<s1.length();i++)
if(a[i]>=b[i])
num++;
if(num==s1.length()) return true;
num=0;
for(int i=0;i<s1.length();i++)
if(a[i]<=b[i])
num++;
return num==s1.length();
}
}
5387. 每个人戴不同帽子的方案数
思路:时隔几周终于出了一个中等难度的dp了,数据很小,一眼过去就是状压dp啦。
我们定义dp[i][j]表示前i个糖果组成状态j的方案数,其中状态j我们用二进制压缩。
class Solution {
public int numberWays(List<List<Integer>> hats) {
int n=hats.size();
int mod=1000000007;
long[][] dp=new long[41][1<<n];
dp[0][0]=1;
for(int i=1;i<=40;i++) {
for(int k=0;k<(1<<n);k++)
dp[i][k]=dp[i-1][k];
for(int j=0;j<n;j++) {
if(hats.get(j).contains(i)) {
for(int k=0;k<(1<<n);k++) {
if(((k>>j)&1)!=0) continue;
dp[i][k|(1<<j)]=(dp[i][k|(1<<j)]+dp[i-1][k])%mod;
}
}
}
}
return (int)dp[40][(1<<n)-1];
}
}