记微软笔试

2022.8.26 7:00pm

第一题

 

类似题:力扣1371. 每个元音包含偶数次的最长子字符串

求有多少个连续字串中所有的字母都出现了偶数次 - 狡啮之仰 - 博客园

第二题

 解法(zjl给我做的)

import java.util.HashMap;

public class code2 {
    public static void main(String []args){
        int []A = new int[]{7,11,8,4,10};
        int M=8;
        int [] arr = new int[A.length];
        HashMap<Integer,Integer> map = new HashMap<>();
        int sum=0;
        map.put(0,1);
        HashMap<Integer,Integer> set = new HashMap<>();
        for(int i=0;i<arr.length-1;i++){
            sum+=A[i+1]-A[i];
            for(int j=M;j<=sum;j+=M){
                if(map.containsKey(sum-j)){
                    set.put(i,i+1);
                }
            }
            map.put(sum,map.getOrDefault(sum,0)+1);
        }
        int count=0;
        int max=0;
        for(int key:set.keySet()){
            int temp = key;
            count=2;
            while(set.containsKey(temp)){
                count++;
                temp = set.get(temp);
            }
            if(max<count){
                max = count;
            }
        }
        System.out.println(max);
    }
} 

经讨论这个写法有问题,比如M=3,A=[1,2,3,5,7,9]的话过不了case,我认为是set表存放数据有问题(我没看懂她放的啥),前半部分可以用她写的(不过还需要先sort,目前没sort的,如果是-3,0,8,10,4的话,10和4无法被扫到),后半部分用我的。前半部分将各个数据转换为了距离,可以规避负数的情况,很巧妙,

我的(时间复杂度更高):

public static int solution(int[] A,int M){
    //ArrayList<Integer> arrayList=new ArrayList<>();
    HashMap<Integer,Integer> map=new HashMap<>();
    int max=1;
    for(int i=0;i<A.length;i++){
        int value=0;
        for (int j=i+1;j<A.length;j++){
            if((A[j]-A[i])%M==0){
                value=value*10+j;
            }
        }
        if(value!=0){
            map.put(i,value);
        }

    }
    //arrayList=new ArrayList<>(new HashSet<>(arrayList));

    for(int key: map.keySet()){
        int count=2;
        int temp=map.get(key);
        while (temp!=0) {
            int remain=temp%10;
            temp=temp/10;
            while (map.containsKey(remain)) {
                count++;
                remain = map.get(remain);
            }
            max = Math.max(max, count);
        }
    }
    return max;
}

 第三题

 

ac了,没记录(对比每个位置的元素,针对A[k]和B[k]不同的,选择最小的,注意有小于0以及A和B完全相等的情况(例3)

知识点:

1.Java中char和String的转换

Java中char和String的转换_耀凯考前突击大师的博客-CSDN博客

2.Java中list去重(用set元素不重复性)

Java中list去重(用set元素不重复性)_fjian123的博客-CSDN博客_java不允许重复的list

3.OutOfMemoryError报错

OutOfMemoryError系列(1): Java heap space_铁锚的博客-CSDN博客

4.位运算符详解(与,或,非,异或)

位运算符详解(与,或,非,异或)_Markble的博客-CSDN博客_位运算符

异或相当于不带进位的二进制加法

5. << 和 >>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值