携程第三次笔试 四道题 100% 60% 40% 20%

昨天携程做了四道题,只AC了一道,大家看看问题出在哪

package xiechen;

import java.util.*;

public class test1 {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int row = in.nextInt();
        int col = in.nextInt();
        List<String> list = new ArrayList<>();
        for(int i=0 ; i<row ; ++i){
            list.add(in.next());
        }
        int ret=0;
        for(int i=0 ; i<row-1 ; ++i){
            for(int j=0 ; j<col-1 ; ++j){
                Set<Character> hashset = new HashSet<>();
                char a = list.get(i).charAt(j);
                char b = list.get(i).charAt(j+1);
                char c = list.get(i+1).charAt(i+1);
                char d = list.get(i+1).charAt(j+1);
                hashset.add(a);
                hashset.add(b);
                hashset.add(c);
                hashset.add(d);
                if(hashset.contains('y') && hashset.contains('o') && hashset.contains('u')){
                    ++ret;
                }

            }

        }
        System.out.println(ret);
    }
}

package xiechen;

import java.util.Scanner;

public class test2 {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n];
        for(int i=0 ; i<n ; ++i){
            nums[i] = in.nextInt();
        }
        for(int i=0 ; i<n ; ++i){
            if(nums[i]%2 == 0){
                help(nums[i]);
            }else{
                System.out.println(nums[i]/2 +" "+ (nums[i]/2+1));
            }
        }
    }

    public static void help(int num){
        int x=1, y=num-1;
        int maxLcm=0;
        int a=x,b=y;
        while(x<num/2){
            if(maxLcm<lcm(x,y)){
                a=x;
                b=y;
            }
            x+=2;
            y-=2;
        }
        System.out.println(a+" "+b);
    }

    public static int lcm(int x, int y){
        int lcm = x*y;
        for(int i=2 ; i<=Math.sqrt(x) ; ++i){
            if(x%i==0 && y%i==0){
                lcm/=i;
                x/=i;
                y/=i;
            }
        }
        return lcm;
    }
}

package xiechen;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Tree{
    int val;
    List<Tree> children = new ArrayList<>();
    int index;
    Tree(int _val, int _index){
        val = _val;
        index = _index;
    }
}
public class test3 {
    static int ans=0;
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        long l=in.nextLong();
        long r=in.nextLong();
        String binary = in.next();
        int[][] edges = new int[n-1][2];
        for(int i=0 ; i<n-1 ; ++i){
            edges[i][0] = in.nextInt()-1;
            edges[i][1] = in.nextInt()-1;
        }
        List<Tree> ts = new ArrayList<>();
        for(int i=0 ; i<n ; ++i){
            ts.add(new Tree(Integer.valueOf(binary.charAt(i)+""), i));
        }

        for(int i=0 ; i<n-1 ; ++i){
            int x=edges[i][0];
            int y=edges[i][1];
            ts.get(x).children.add(ts.get(y));
            ts.get(y).children.add(ts.get(x));
        }

        boolean[] visit = new boolean[n];
        for(int i=0 ; i<n ; ++i){
            visit[i] = true;
            dfs(ts.get(i), String.valueOf(ts.get(i).val), visit, i, l, r);
            visit[i]=false;
        }
        System.out.println(ans);

    }


    public static void dfs(Tree ts, String binary, boolean[] visit, int i, long l, long r){
        long num = Long.parseLong(binary, 2);
        if(num>=l && num<=r){
            ++ans;
        }
        for(int j=0 ; j<ts.children.size() ; ++j){
            Tree t = ts.children.get(j);
            if(visit[t.index]){
                continue;
            }
            visit[t.index] = true;
            dfs(t, binary+t.val, visit, t.index, l, r);
            visit[t.index] = false;
        }

    }

}

第四题用了中心扩散法计算,超时了

#23届找工作求助阵地#
全部评论
第四题: 例如 11100011,中间的 000 有 1+2+3 个回文串,左边是 111,右边是 11,选小的,回文串 += 2 如果 000 两边的 1 串长度相等,继续扩散;否则退出
2 回复 分享
发布于 2023-04-16 14:10 广东
第二题有规律,花好长时间发现。如果n是奇数和你的做法一样;偶数分两种情况:第一种是half为偶数的情况,直接返回half-1和half+1;第二种是half为奇数的情况,直接返回half-2和half+2。n为2单独讨论,n为4不用单独讨论。就AC了。 第三题我80%,第四题没时间做,太菜不评论了。
1 回复 分享
发布于 2023-04-16 13:46 重庆

相关推荐

评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务