目录
1、找出强数对的最大异或值 - 暴力
2、高访问员工 - 哈希表 + 模拟
3、最大化数组末位元素的最少操作次数 - 思维 + 贪心
1、找出强数对的最大异或值 - 暴力
找出强数对的最大异或值 I
class Solution {
public int maximumStrongPairXor(int[] a) {
int n=a.length,max=0;
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
if(Math.abs(a[i]-a[j])<=Math.min(a[i],a[j]))
{
max=Math.max(max,a[i]^a[j]);
}
}
}
return max;
}
}
2、高访问员工 - 哈希表 + 模拟
高访问员工
思路:
名字存其下所有时间(换算成分钟数),然后进行排序
另每个时间+59=限制时间,向该时间后查找,如果出现2个小于限制时间,则将该名字存入答案并跳出遍历下一个名字
class Solution {
public List<String> findHighAccessEmployees(List<List<String>> a) {
Map<String,List<Integer>> mp=new HashMap<>();
List<String> res=new ArrayList<>();
for(int i=0;i<a.size();i++)
{
String name=a.get(i).get(0);
String time=a.get(i).get(1);
List<Integer> t=mp.getOrDefault(name,new ArrayList<>());
t.add(trans(time));
mp.put(name,t);
}
for(Map.Entry<String,List<Integer>> x:mp.entrySet())
{
List<Integer> t=x.getValue();
String name=x.getKey();
Collections.sort(t);
System.out.println(name+" "+t);
boolean f=false;
for(int i=0;i<t.size()-2;i++)
{
if(f) break;
int limt=t.get(i)+59,cnt=1;
for(int j=i+1;j<t.size();j++)
{
if(t.get(j)<=limt) cnt++;
if(cnt==3)
{
f=true;
res.add(name);
break;
}
}
}
}
return res;
}
public int trans(String s)
{
int res=Integer.parseInt(s.substring(0,2))*60+Integer.parseInt(s.substring(2));
return res;
}
}
3、最大化数组末位元素的最少操作次数 - 思维 + 贪心
2934. 最大化数组末位元素的最少操作次数
思路:
只有两种情况:
- 交换最后一位数
- 不交换最后一位数
对这两种情况,再遍历【0~n-2】序号的数i
- 如果若 nums1[i]>nums1[n−1]或 nums2[i]>nums2[n−1],则交换 nums1[i]和 nums2[i]
- 若交换后仍有 nums1[i]>nums1[n−1] 或 nums2[i]>nums2[n−1],则当前情况无解
class Solution {
public int minOperations(int[] nums1, int[] nums2) {
int n=nums1.length;
return Math.min(f(nums1[n-1],nums2[n-1],nums1,nums2),1+f(nums2[n-1],nums1[n-1],nums1,nums2));
}
public int f(int last1,int last2,int[] a,int[] b)
{
int res=0;
for(int i=0;i<a.length-1;i++)
{
if(a[i]>last1||b[i]>last2)
{
if(b[i]>last1||a[i]>last2) //如果交换后 仍不满足条件,则后面无论怎么换都存在数组内元素大于末尾元素,返回-1
return -1;
res++;
}
}
return res;
}
}