题目链接:3606. 优惠券校验器(简单)
算法原理:
解法:模拟
击败47.54%
时间复杂度O(Nlogn)
这题的思路非常简单,但是实现起来比较麻烦,感觉应该算个中等题,主要就是考察排序
记忆👇
- 字符串比:compareTo ✅
什么词序、字典序、名称排序都用它
- 数字比:用包装类的 compare ✅
Integer.compare(a, b)、Double.compare(a, b)
- 其他基本类型:直接相减 ✅
char1 - char2、int1 - int2(小数值可用)
Java代码:
java
class Solution {
public List<String> validateCoupons(String[] c, String[] b, boolean[] isActive) {
int n=c.length;
List<String> ret=new ArrayList<>();
String[][] tmp=new String[n][2];
for(int i=0;i<n;i++){
if(isc(c[i])&&isb(b[i])&&isActive[i]){
tmp[i][0]=c[i];
tmp[i][1]=b[i];
}else{
//标记为无效记录,防止空指针报错
tmp[i][0]="";
tmp[i][1]="";
}
}
Arrays.sort(tmp,(x,y)->{
//处理空记录:空记录排在最后
if(x[0].equals("")&&y[0].equals("")) return 0;
if(x[0].equals("")) return 1;//x为空,x在后面
if(y[0].equals("")) return -1;//y为空,x在前面
//先比较品牌首字符
int tmpret=Character.compare(x[1].charAt(0),y[1].charAt(0));
if(tmpret!=0) return tmpret;
//品牌首字母相同,再比较代码
return x[0].compareTo(y[0]);
});
for(String[] t:tmp){
if(t[0].equals("")) continue;
ret.add(t[0]);
}
return ret;
}
private boolean isc(String s){
for(char c:s.toCharArray()){
if(!(c>='a'&&c<='z')&&!(c>='A'&&c<='Z')
&&!(c>='0'&&c<='9')&&!(c=='_'))
return false;
}
return true;
}
private boolean isb(String s){
return (s.equals("electronics")||s.equals("grocery")||s.equals("pharmacy")||s.equals("restaurant"));
}
}