笔试狂刷--Day8(多源bfs,约瑟夫环)

本文解析了三个编程面试题目:使用贪心策略解决游游的you问题,利用多源BFS解决腐蚀苹果,以及分析孩子们的游戏(约瑟夫环)的解法,展示了Java编程技巧和算法应用。
摘要由CSDN通过智能技术生成

大家好,我是LvZi,今天带来笔试狂刷--Day8
在这里插入图片描述

一.游游的you

题目链接:游游的you

分析:

模拟 + 贪心
先保证you的数量,再处理剩余的oo

代码:

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int q = in.nextInt();
        while (q-- > 0) {
            int a = in.nextInt(), b = in.nextInt(), c = in.nextInt();

            int ret = 0;
            int min = Math.min(a, Math.min(b, c));
            if (min >= 1) ret += min * 2;
            a -= min; b -= min; c -= min;
            if(b > 0) 
                ret += (b - 1);
            System.out.println(ret);
        }
    }
}

二.腐蚀苹果

题目链接:腐蚀苹果

分析:

多源bfs

代码:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型ArrayList<ArrayList<>> 
     * @return int整型
     */
     int[] dx = {1,-1,0,0};
     int[] dy = {0,0,1,-1};
    public int rotApple (ArrayList<ArrayList<Integer>> grid) {
        // write code here
        int m = grid.size(), n = grid.get(0).size(), ret = 0;
        int[][] dist = new int[m][n];
        Queue<int[]> q = new LinkedList<>();
        boolean flg = false;
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(grid.get(i).get(j) == 2) {
                    q.add(new int[]{i ,j});
                    flg = true;
                }
                else dist[i][j] = -1;
            }
        }

        if(!flg) return -1;
        while(!q.isEmpty()){
            int[] t = q.poll();
            int a = t[0], b = t[1];
            for(int k = 0; k < 4; k++) {
                int x = a + dx[k], y = b + dy[k];
                if(x >= 0 && y >= 0 && x < m && y < n && dist[x][y] == -1 && grid.get(x).get(y) == 1) {
                    q.add(new int[]{x, y});
                    dist[x][y] = dist[a][b] + 1;
                    ret = Math.max(ret, dist[x][y]);
                }
            }
        }

        // 判断是否有未被腐蚀的平股票
        for(int i = 0; i < m; i++)
            for(int j = 0; j < n; j++)
                if(dist[i][j] == -1 && grid.get(i).get(j) == 1) 
                    return -1;
        
        return ret;
    }
}

三.孩⼦们的游戏(约瑟夫环)

题目链接:孩⼦们的游戏(约瑟夫环)

分析:

找规律
假设N = 15 M = 3

  1. 删除2
  2. 删除5(5 = 2 + M)
  3. 删除8(8 = 5 + M)

逆向思维:
如果最后只剩一个人,则一定是0位置(每删除一个人都是将下一个位置当做起始位置0),如果剩两个人,另一个人的位置是0 + M,以此类推到一共有N个人的时候

代码:

    public int LastRemaining_Solution (int n, int m) {
        // write code here
        int ans = 0;
        for(int i = 2; i <= n; i++) 
            ans = (ans + m) % i;
        return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值