拼多多笔试 8.31 A3.7题代码

第一题

大意:给你两个数组,两个数组中的两个数差值不大于k的可以匹配上,匹配上后要删除这两个数,问最多有多少匹配上的,1<=数组的值<=100
排序加两个指针
ac

package nowcoder;

import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main50 {
    public static void main(String[] args) {
        new Solve50().solve();
    }
}
class Solve50{
    public void solve(){
        Scanner s=new Scanner(new BufferedInputStream(System.in));
        int t=s.nextInt();
        for (int i = 0; i < t; i++) {
            int n=s.nextInt();
            int m=s.nextInt();
            int k=s.nextInt();
            int[] r=new int[n];
            int[] b=new int[m];
            for (int j = 0; j < n; j++) {
                r[j]=s.nextInt();
            }
            for (int j = 0; j < m; j++) {
                b[j]=s.nextInt();
            }
            System.out.println(getAns(r,b,k));
        }
    }
    private int getAns(int[] r,int[] b,int k){
        int[] rCount=new int[101];
        int[] bCount=new int[101];
        for(int i:r)rCount[i]++;
        for(int i:b)bCount[i]++;
        int p1=1,p2=1;
        int ans=0;
        while (p1<=100&&p2<=100){
            if (p2-p1>k){
                p1++;
                continue;
            }
            if (p1-p2>k){
                p2++;
                continue;
            }

            if (rCount[p1]>bCount[p2]){
                rCount[p1]-=bCount[p2];
                ans+=bCount[p2];
                p2++;
            }else{
                bCount[p2]-=rCount[p1];
                ans+=rCount[p1];
                p1++;
            }
        }
        return ans;
    }
}

第二题

大意:有一个特殊的字符串,对称位置可以互相交换,定义字符串A<字符串B:当A的一种形式的字典序小于B的所有形式的字典序
给你一堆字符串,让你按从小到大输出,相等的字符串按出现顺序排序。
思路:找出A B的最小字符串,然后比较最后排序
ac

package nowcoder;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;

public class Main51 {
    public static void main(String[] args) {
        new Solve51().solve();
    }
}

class Solve51{
    private class Node{
        String str;
        int pos;

        public Node(String str, int pos) {
            this.str = str;
            this.pos = pos;
        }
    }
    public void solve(){
        Scanner s=new Scanner(new BufferedInputStream(System.in));
        int n=s.nextInt();
        s.nextLine();
        Node[] nodes=new Node[n];
        for (int i = 0; i < n; i++) {
            nodes[i]=new Node(s.nextLine(),i);
        }
        Arrays.sort(nodes,(x,y)->{
            String s1=getMin(x.str);
            String s2=getMin(y.str);
            int diff=s1.compareTo(s2);
            if (diff!=0)return diff;
            return x.pos-y.pos;
        });
        PrintWriter out=new PrintWriter(new BufferedOutputStream(System.out));
        for(Node node:nodes)out.println(node.str);
        out.flush();
    }

    private String getMin(String str){
        int len=str.length();
        char[] chars=str.toCharArray();
        for (int i = 0; i <len/2 ; i++) {
            if (chars[len-i-1]<chars[i]){
                char c=chars[i];
                chars[i]=chars[len-i-1];
                chars[len-i-1]=c;
            }
        }
        return new String(chars);
    }
}

第三题

大意:给你一个数n,代表n根火柴棍,问最多能拼多少个正方形
这题吧,首先是个贪心,你得先找出怎么拼正方形用的棍子最少,我的思路是先拼成一个平方的(即floor(sqrt(n))) n代表正方形个数,然后在拼下一行,下一行铺满了,在去竖着铺一列
对能拼多少个正方形进行二分
ac

package nowcoder;

import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main52 {
    public static void main(String[] args) {
        Solve s=new Solve();
        s.solve();
    }
}
class Solve{
//    final long MAX=(long)1e16;
    public void solve(){
        Scanner s=new Scanner(new BufferedInputStream(System.in));
        int t=s.nextInt();
        for (int i = 0; i < t; i++) {
            long n=s.nextLong();
            long left=0,right=(long)1e16/2;
            long ans=0;
            while (left<=right){
                long mid=(left+right)/2;
                if (get(mid)<=n){
                    ans=mid;
                    left=mid+1;
                }else{
                    right=mid-1;
                }
            }
            System.out.println(ans);
        }
    }
    //建造n个需要多少木棍
    public long get(long n){
        long ans=0;
        long len= (long) Math.sqrt(n);
        long need=len*(4+(len-1)*2);
        ans=need;
        //还有多少个需要建造
        long left=n-len*len;
        if (left==0)return ans;
        if (left<=len){
            ans+=3+(left-1)*2;
        }else{
            ans+=3+(len-1)*2;
            left-=len;
            ans+=3+(left-1)*2;
        }
        return ans;
    }

}

第四题

不会,输出n过了70%,美滋滋,求大神给个解答。

#拼多多笔试##笔经##拼多多#
全部评论
唉 日了 java Array.sort() 是不是稳定的啊 jdk 竟然这么写 This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort
点赞 回复
分享
发布于 2021-08-31 21:05
大神,膜拜
点赞 回复
分享
发布于 2021-08-31 21:08
联易融
校招火热招聘中
官网直投
太强了
点赞 回复
分享
发布于 2021-08-31 21:46
第四题,不知道对不对。递归,如果>=2行长度为1,则划掉最左边一列。剩余的格子转化为若干更小的问题。过了90%
点赞 回复
分享
发布于 2021-08-31 22:57
一个小时多一点做了前三道直接躺平了 。。没想到第四题输出n还可以骗这么多分。。
点赞 回复
分享
发布于 2021-09-01 00:09
题目都没看完的小弟在此膜拜大佬🧐难,真难
点赞 回复
分享
发布于 2021-09-01 10:49
谢了兄弟
点赞 回复
分享
发布于 2021-09-02 14:07
    private long temp(long n){         //平方根         long len = (long)Math.sqrt(n);         //先使用n视图拼出正方形         /**          *  (len-1)个 2火柴,一个4火柴,这是一列,共有len个这样的列          */         long res = len*(4+(len-1)*2);         //还需要多少个         long other = n-len*len;         if(other==0)return res;         if(other<=len){             //只够补一行/列             res+=3+(other-1)*2;         }else {             res+=3+(len-1)*2;//补一行             other-=len;             res+=3+(other-1)*2;//补一列         }         return res;     } 我解释一下帖主第三题的几行代码:long len = (long)Math.sqrt(n);先视图用用n个小正方行拼出最大程度的大正方形,所以开方。long res = len*(4+(len-1)*2); 在纸上画一下,len-1个“直角火柴”(2),一矩形火柴(4),组成一列,共有len个这样的列,而且(4)重合的部分会补上最后的边。long other = n-len*len; 统计还剩下几个(最多能够拼出一个完整的行或者列)。res+=3+(other-1)*2;剩下的小方块数量够填充多长的列/行。
点赞 回复
分享
发布于 2021-09-02 22:02
约面了嘛楼主
点赞 回复
分享
发布于 2021-09-03 10:21

相关推荐

10 19 评论
分享
牛客网
牛客企业服务