用友昨日笔试

题目可以看这位牛友发的

https://www.nowcoder.com/discuss/648838695012814848

还没投校招却收到了笔试邀请(倒是之前投过实习

上来就拉了坨大的,题目比较晦涩难懂,不乏歧义句,比如第一题的设定中说

第一行输入一个正整数 n

接下来 n行,当前节点与其他j个节点的上下游关系...

当j=-1时,是终止节点

nm这个j既是数量又是节点id

本来限定java写算法就不快,还浪费了不少时间读题目。。。。

前两题用贪心算法直接就过了,第三题明显跳台阶要用dp做,可惜只a了80%,就不放出来献丑了,为了最后一题没排查,结果最后一题根本没时间写....

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static boolean checkSeq(List<List<Integer>> nodes, int[] check, int index){
        List<Integer> node = nodes.get(index);
        if(node.get(0)==-1){   //终止节点
            return true;
        }
        check[index] = 1;
        for(int i=0;i<node.size();i++){
            int newIndex = node.get(i);   // 每次取出一个节点递归遍历
            if(check[newIndex]==1){
                return false;
            }
            check[newIndex] = 1;   //递归前记得记录,返回时记得回溯
            if(!checkSeq(nodes, check, newIndex)){
                return false;
            }
            check[newIndex] = 0;
        }
        check[index] = 0;
        return true;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            String line = in.nextLine();
            int n = Integer.valueOf(line);
            List<List<Integer>> nodes = new ArrayList<>();
            for(int i=0;i<n;i++){
                List<Integer> node = new ArrayList<>();
                line = in.nextLine();
                String[] nodelists = line.split(" ");
                for(String num: nodelists)
                    node.add(Integer.valueOf(num));
                nodes.add(node);
            }

            for(int i=0;i<n;i++) {
                int[] check = new int[n];  //使用一个数组记录判断是否有环
                if(checkSeq(nodes, check, i)){
                    System.out.print(i);
                    System.out.print(" ");
                }
            }
        }
    }
}

第二题

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test {
    public static boolean solve(int damage, int limit){
        int multi=0;
        //从两份开始分(题目已说明)
        for(int i=2; i*i<=damage;i++){
            int v = damage/i;   //底数
            int m = damage%i;   //余数,如14分成3分份的结果 4+4+4+2
            multi = (int)Math.pow(v, i);
            if(m!=0){
                multi *= m;  //余数不为0补上
            }
            if(multi > limit){
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int limit = in.nextInt();
            int damage = in.nextInt();

            if(solve(damage, limit)){
                System.out.println(true);
            }
            else{
                System.out.println(false);
            }
        }
    }
}

全部评论
第二题主要还是贪心认为:同样的数的乘积比不同数间的乘积大
点赞 回复 分享
发布于 08-02 20:45 福建

相关推荐

1 2 评论
分享
牛客网
牛客企业服务