面试编程题目(一)细菌总数计算

题目如图
在这里插入图片描述
第一题

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @description: 细菌实体类
 * @author: zhangmy
 * @Version: 1.0
 * @create: 2021-03-30 11:23
 **/
@Data
@AllArgsConstructor
public class Bacteria {

    //最大繁殖次数
    private static final int MAX_BREED_NUMBER = 3;
    //可繁殖时间
    private static final int CAN_BREED_TIME = 20;
    //繁殖间隔
    private static final int BREED_CD_TIME = 30;

    //存活时间
    private int liveMinute;
    //繁殖次数
    private int breedNumber;
    //距离可繁殖的倒计时
    private int breedCountDown;
    //当前是否可繁殖
    private boolean isCanBreed;
    //细菌是否死亡
    private boolean isDead;

    public Bacteria() {
        this.liveMinute = 0;
        this.breedNumber = 0;
        this.isCanBreed = false;
        this.breedCountDown = 20;
        this.isDead = false;
    }

    //生长
    public void grow(int minutes) {
        this.liveMinute = this.liveMinute + minutes;
        this.breedCountDown = this.breedCountDown - minutes;
        if (this.liveMinute > 150) {
            this.isDead = true;
            return;
        }
        if (!this.isDead && this.breedCountDown == 0 && this.breedNumber < MAX_BREED_NUMBER) {
            this.isCanBreed = true;
        } else {
            this.isCanBreed = false;
        }
    }

    //繁殖
    public List<Bacteria> breed(){
        if (!this.isCanBreed) {
            return Collections.emptyList();
        }
        //繁殖过后次数加1
        this.breedNumber++;
        this.breedCountDown = BREED_CD_TIME;
        return Arrays.asList(new Bacteria(),new Bacteria());
    }

}

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

/**
 * @description: 测试Main
 * @author: zhangmy
 * @Version: 1.0
 * @create: 2021-03-30 11:59
 **/
public class Main {

    public static void main(String[] args) {

        Bacteria bacteria1 = new Bacteria();
        System.out.println(List.class.getClassLoader());
        System.out.println(bacteria1.getClass().getClassLoader().getParent());
        Scanner in = new Scanner(System.in);
        while (true) {
            System.out.println("输入时间:");
            int minute = in.nextInt();
            long totalStart = System.currentTimeMillis();
            List<Bacteria> bacterias = new ArrayList<>();
            bacterias.add(new Bacteria());
            for (int i = 10; i <= minute; i+=10) {
                List<Bacteria> bornBacterias = new ArrayList<>();
                long start = System.currentTimeMillis();
                for (int j = 0; j < bacterias.size();j++) {
                    Bacteria bacteria = bacterias.get(j);
                    bacteria.grow(10);
                    if (bacteria.isDead()) {
                        bacterias.remove(bacteria);
                        j--;
                        continue;
                    }
                    bornBacterias.addAll(bacteria.breed());
                }
                long end = System.currentTimeMillis();
                System.out.println("遍历了" + bacterias.size() + "个!耗时:" + (end - start) + "ms");
                bacterias.addAll(bornBacterias);

                //System.out.println("观察时间点:" + i + ",细菌有:" + bacterias.size());
            }
            long totalEnd = System.currentTimeMillis();
            System.out.println("总耗时:" + (totalEnd - totalStart) + "ms");
            System.out.println("细菌总个数:" + bacterias.size());
        }
    }

}

第一题面试官给的答案是满意。

第二题

import java.util.*;
import java.util.stream.Collectors;

/**
 * @description: 数字区间
 * @author: zhangmy
 * @Version: 1.0
 * @create: 2021-03-30 13:54
 **/
public class ParseNumber {

    //解析输入
    public static Set<Long> parseRule(String rule) {
        Set<Long> result = new HashSet<>();
        String[] split = rule.split(",");
        for (int i = 0; i < split.length; i++) {
            if (split[i].contains("-")) {
                String[] numbers = split[i].split("-");
                if (numbers.length == 2) {
                    Long start = Long.parseLong(numbers[0]);
                    Long end = Long.parseLong(numbers[1]);
                    for (Long index = start; index < end; index++) {
                        result.add(index);
                    }
                }
            } else {
                result.add(Long.parseLong(split[i]));
            }
        }
        return result;
    }

    public static String deparseRule(Set<Long> set) {
        StringBuilder result = new StringBuilder();
        List<String> members = new ArrayList<>();
        List<Long> list = new ArrayList<>(set).stream().sorted().collect(Collectors.toList());

        for (int i = 0; i < list.size(); i++) {
            StringBuilder sb = new StringBuilder();
            sb.append(list.get(i));
            //区间形式
            if ((i + 1 < list.size()) && (list.get(i + 1) == list.get(i) + 1)) {
                sb.append("-");
                while ((i + 1 < list.size()) && (list.get(i + 1) == list.get(i) + 1)) {
                    i++;
                }
                //右开,需要+1
                sb.append(list.get(i) + 1);
            }
            members.add(sb.toString());
        }
        for (String temp : members) {
            result.append(temp).append(",");
        }
        //去掉最后一个逗号
        String substring = result.substring(0, result.length() - 1);
        return substring;
    }

    //判断是否是子集
    public static boolean isFullContains(Set<Long> a,Set<Long> b) {
        for (Long i : a) {
            if (!b.contains(i)) {
                return false;
            }
        }
        return true;
    }

    //计算交集
    public static Set<Long> calIntersection(Set<Long> a,Set<Long> b) {
        Set<Long> result = new HashSet<>();
        for (Long i : a) {
            if (b.contains(i)) {
                result.add(i);
            }
        }
        return result;
    }

    //计算并集
    public static Set<Long> calSet(Set<Long> a,Set<Long> b) {
        a.addAll(b);
        return a;
    }

}

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

/**
 * @description: 测试Main
 * @author: zhangmy
 * @Version: 1.0
 * @create: 2021-03-30 11:59
 **/
public class Main {

    public static void main(String[] args) {
        //默认区间左闭右开
        String as = "1,5-99999";
        String bs = "2,4-99999";

        long start = System.currentTimeMillis();
        //判断是否包含
        Set<Long> a = ParseNumber.parseRule(as);
        Set<Long> b = ParseNumber.parseRule(bs);
        System.out.println("是否包含:" + ParseNumber.isFullContains(a,b));
        //求交集
        Set<Long> intersection = ParseNumber.calIntersection(a, b);
        System.out.println("交集:" + ParseNumber.deparseRule(intersection));

        //求并集
        Set<Long> set = ParseNumber.calSet(a, b);
        System.out.println("并集:" + ParseNumber.deparseRule(set));
        long end = System.currentTimeMillis();
        System.out.println("消耗时间:" + (end - start) + "ms");
    }

}

第二题面试官未作评价,尚未知结果如何。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值