离谱的虾皮,我8.18做完之后,北京岗挂了,深圳岗捞了之后还要再做一次,不过这次提比上次的简单,动规贪心图都没有,又一个题的用例只能过90%,
1.给一个数组,输出最大的k个数之和。
直接sort排序,然后加就行
public class one1 {
public static void main(String[] args) {
int[] nums={4,1,7,3,9,2};
int k=3;
System.out.println(maxK(nums,k));
}
public static int maxK(int[] nums, int k) {
// write code here
Arrays.sort(nums);
int res=0;
int n=nums.length-1;
while(k>0){
res+=nums[n];
n--;
k--;
}
return res;
}
}
2.一个数组,由01构成,0表示空,1表示种了花,现在给你一个数组,给你一个k,问能不能把k个花种下
public class two1 {
/**
* Note: 类名、方法名、参数名已经指定,请勿修改
*
*
*
* @param flowerbed int整型 一维数组
* @param n int整型
* @return bool布尔型
*/
public static void main(String[] args) {
int[] nums={1,0,0,0,1};
int n=3;
System.out.println(plantFlowers(nums,n));
}
public static boolean plantFlowers(int[] flowerbed, int n) {
// write code here
int length=flowerbed.length;
int count=0;
for(int i=0;i<length;i++){
if(flowerbed[i]==0&&(i==0||flowerbed[i-1]==0)
&&(i==length-1||flowerbed[i+1]==0)){
count++;
flowerbed[i]=1;
}
}
return count>=n;
}
}
3.一个字符串,给一个k,求连续k个字符串出现次数最多的那一个子串
直接用hash表,字符串拼接,子串作为key,个数为value
public class three {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int[] arr1={1,5,13,15};
int[] arr2={10,11,17,20};
int x=20;
int[] res=findClosetPair(arr1,arr2,x);
System.out.println(res[0]+res[1]);
}
public static int[] findClosetPair(int[] arr1, int[] arr2, int x) {
// write code here
int[] arr=new int[arr2.length];
for(int i=0;i<arr.length;i++){
arr[i]=i;
}
Integer[] sort2=new Integer[arr2.length];
for(int i=0;i< arr2.length;i++){
sort2[i]=arr2[i];
}
Arrays.sort(sort2);
int c=Integer.MAX_VALUE;
int[] res=new int[2];
for (int i=0;i< arr1.length;i++){
int index=find(sort2,x-arr1[i]);
int cur=Math.abs(x-(arr1[i]+sort2[index]));
if(cur<c){
c=cur;
res[0]=i;
res[1]=arr[index];
}
}
return res;
}
public static int find(Integer[] arr,int target){
int l=0,r=arr.length-1;
while(l<r){
int mid=l+(r-l)/2;
if(arr[mid]<target){
l=mid+1;
}else {
r=mid;
}
}
if (l==0) return l;
if(Math.abs(arr[l]-target)<Math.abs(arr[l-1]-target)) return l;
else return l-1;
}
}