Java基础练习八(二维数组)

news2024/11/24 16:26:29

1.装水问题

有一个 异形 容器,用一个 n * n 的二维数组来表示。其中 1 表示容器实心部分, 0 表示空心部分。现使用此容器装水,能装多少水(每个元素都表示一份水,只有有挡板的部分能装水)?

在这里插入图片描述

public class Work1001 {
    public static void main(String[] args) {
        int[][] arr = {
                {0, 0, 1, 0, 0, 0, 0},
                {0, 0, 1, 0, 0, 0, 0},
                {0, 0, 1, 0, 1, 0, 0},
                {1, 0, 1, 0, 1, 0, 1},
                {1, 1, 1, 1, 1, 1, 1},
        };
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            int count = 0;
            int v = 0;
            for (int j = 0; j < arr[0].length; j++) {
                if (arr[i][j] == 1) {
                    count++;
                    if (count == 2) {
                        count = 1;
                        sum += v;
                        v = 0;
                    }
                } else {
                    if (count > 0) {
                        v++;
                    }
                }
            }
        }
        System.out.println(sum);
    }
}

思考:若是使用一个一维数组来表示实心部分高度该如何计算?(int[] arr = {2, 5, 1, 2, 3, 4, 7, 2}; )

import java.util.Arrays;

public class Work10012 {
    public static void main(String[] args) {
        int[] arr = {2, 5, 1, 2, 3, 4, 7, 2};
        int len = Arrays.stream(arr).max().orElse(0);
        // 定义二维数组
        int[][] arr1 = new int[len][arr.length];
        // 将一维数组转为二维数组
        for (int i = len - 1; i >= 0; i--) {
            for (int j = 0; j < arr.length; j++) {
                if (arr[j] > 0) {
                    arr1[i][j] = 1;
                    arr[j]--;
                }
            }
        }
        // 计算能装多少水
        int sum = 0;
        for (int i = 0; i < arr1.length; i++) {
            int count = 0;
            int v = 0;
            for (int j = 0; j < arr1[0].length; j++) {
                if (arr1[i][j] == 1) {
                    count++;
                    if (count == 2) {
                        count = 1;
                        sum += v;
                        v = 0;
                    }
                } else {
                    if (count > 0) {
                        v++;
                    }
                }
            }
        }
        System.out.println(sum);
    }
}

Arrays.stream(arr).max().orElse(0) 这行代码使用了 Java 8 中的流式操作。每个部分的含义:

  • 对于给定的数组 arr,Arrays.stream(arr) 方法将其转换为一个流(Stream)对象。流是用于在一系列元素上执行操作的一种高级抽象。

  • 然后,我们使用 .max() 方法来获取流中的最大值。这将返回一个 Optional 类型的对象,它可以包含一个整数值(如果流中有元素),或者为空(如果流为空)。

  • 最后,我们使用 .orElse(0) 方法指定一个默认值。如果 Optional 对象为空,则返回指定的默认值,否则返回 Optional 中包含的值。

  • 在这个特定的例子中,如果数组 arr 不为空,.max() 方法将返回一个 Optional 对象,其中包含数组中的最大值。如果数组为空,.max() 方法将返回一个空的 Optional 对象。接着,.orElse(0) 方法将被调用,如果 Optional 为空,则返回默认值 0。

整个表达式 Arrays.stream(arr).max().orElse(0) 的作用是:获取数组 arr 中的最大值,如果数组为空,则返回默认值 0。

2. 迷宫游戏【拓展】

在一个二维数组中,0 表示空地,1 表示墙壁,9 表示目标点。你的任务是从起始点 (0, 0)出发,判断是否能够到达目标点,不能斜着移动。

public class Work1002 {
    public static void main(String[] args) {
        int[][] arr = {
                {0, 0, 0, 0, 0},
                {1, 1, 0, 1, 0},
                {0, 0, 0, 0, 0},
                {0, 1, 1, 1, 1},
                {0, 0, 0, 0, 9}
        };
        boolean canReach = canReachTarget(arr);
        System.out.println(canReach ? "可以到达目标点" : "无法到达目标点");
    }

    public static boolean canReachTarget(int[][] maze) {
        int m = maze.length;    // 行数
        int n = maze[0].length; // 列数
        boolean[][] visited = new boolean[m][n]; // 标记数组,记录是否访问过

        return dfs(maze, 0, 0, visited);
    }

    private static boolean dfs(int[][] maze, int i, int j, boolean[][] visited) {
        if (i < 0 || i >= maze.length || j < 0 || j >= maze[0].length || maze[i][j] == 1 || visited[i][j]) {
            return false; // 越界、遇到墙壁或已经访问过的位置,返回false
        }

        if (maze[i][j] == 9) {
            System.out.println("到达目标点 (" + i + ", " + j + ")");
            return true;  // 找到目标点,返回true
        }

        visited[i][j] = true;  // 标记当前位置为已访问

        System.out.println("移动到位置 (" + i + ", " + j + ")");

        // 分别尝试上、下、左、右四个方向的移动
        boolean canReach = dfs(maze, i - 1, j, visited) ||
                dfs(maze, i + 1, j, visited) ||
                dfs(maze, i, j - 1, visited) ||
                dfs(maze, i, j + 1, visited);

        visited[i][j] = false;  // 回溯,取消当前位置的标记

        return canReach;
    }
}

3. 九宫格求和

一个二维数组,找出最小值,求以最小值为中心的九宫格的和,如果九宫格空缺,空缺位置用0补充。

public class Learn1001 {
    public static void main(String[] args) {
        int[][] arr = {
                {9, 10, 11, 12},
                {100, 20, 30, 40},
                {13, 14, 15, 16},
                {5, 6, 7, 10},
        };
        int n = arr.length;
        int m = arr[0].length;
        // 求最小值
        int[] index = new int[2];
        int min = arr[0][0];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (arr[i][j] < min){
                    min = arr[i][j];
                    index[0] = i;
                    index[1] = j;
                }
            }
        }
        System.out.println(Arrays.toString(index));

        int sum = 0;
        for (int i = index[0] - 1; i <= index[0] + 1; i++) {
            for (int j = index[1] - 1; j <= index[1] + 1; j++) {
                if (i >=0 && i < n && j >= 0 && j < m) {
                    sum += arr[i][j];
                } else {
                    sum += 0;
                }
            }
        }
        System.out.println(sum);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/860524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习】若依源码(前后端分离版)之 “ 获取角色权限信息及动态路由”

大型纪录片&#xff1a;学习若依源码&#xff08;前后端分离版&#xff09;之 “ 获取角色权限信息及动态路由” 获取用户信息获取路由信息 承接上回&#xff0c;我们发现在login请求后面跟了两个请求&#xff0c;今天我们就来了解一下两个请求的含义。 获取用户信息 先看 ‘…

Vulhub之Apache HTTPD 换行解析漏洞(CVE-2017-15715)

Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞&#xff0c;在解析PHP时&#xff0c;1.php\x0A将被按照PHP后缀进行解析&#xff0c;导致绕过一些服务器的安全策略。 1、docker-compose build、docker-compo…

yolov5的报错

【定期水一期】 &#xff08;这个问题很抓马&#xff0c;可以看一下这篇文章&#xff1a;Git Bash 教程&#xff01;【不是所有人都会用Git】&#xff09; 一&#xff1a;没有cv2这个模块 解决方案&#xff1a; pip install opencv-python -i http://pypi.douban.com/simple/…

Java用方法实现数组拷贝

Java用方法实现数组拷贝 需求分析代码实现小结Time 需求分析 1.首先&#xff0c;考虑方法是否需要接收数据处理&#xff1f; 该方法的目的是拷贝数组&#xff0c;拷贝哪一个数组呢&#xff1f; 需要调用者传递 所以&#xff0c;参数应该是一个数组 2.接着&#xff0c;考虑方法是…

k8s常用资源管理

目录 Pod&#xff08;容器组&#xff09;&#xff1a;Pod是Kubernetes中最小的部署单元&#xff0c;可以包含一个或多个容器。Pod提供了一种逻辑上的封装&#xff0c;使得容器可以一起共享网络和存储资源 1、创建一个pod 2、pod管理 pod操作 Pod&#xff08;容器组&#xff…

单机游戏防破解方案解析

近年来&#xff0c;游戏市场用户规模趋于稳定&#xff0c;游戏市场进入了存量时代&#xff0c;各赛道“人满为患”&#xff0c;如何在一片红海中站稳脚跟成了厂商的必修课。 而在快节奏的社会环境下&#xff0c;脱离了网游社交粘性&#xff0c;主打清爽、自由的单机游戏&#…

软考圈地震!2023年下半年软考改为机考,报名时间推迟到9月4日

【1】通知原文 关于2023年下半年计算机软件资格考试有关工作调整的通知 各省、自治区、直辖市及计划单列市、新疆生产建设兵团&#xff0c;香港、澳门计算机软件资格考试考务管理机构: 为全面做好计算机软件资格考试安全防控工作&#xff0c;确保考试公正、公平。现将有关工…

【C语言学习】构造函数求出1到10、20到30、40到50的三个和

求出1到10、20到30、40到50的三个和 代码一&#xff1a;代码复制 #include<stdio.h> int main() {int i;int sum;for(i1,sum0; i<10; i){sum sum i;}printf("%d到%d的和是%d\n", 1, 10, sum);for(i20,sum0; i<30; i){sum sum i;}printf("%d到…

易服客工作室:如何创建有用的内容日历

利用技巧和工具优化您的内容营销效率和效果。创建一个内容日历&#xff0c;您的整个团队都会从中受益&#xff01; 欢迎来到熙熙攘攘、瞬息万变的内容营销世界&#xff0c;在这里&#xff0c;截止日期到来的速度比喝咖啡的猎豹还要快。 现在&#xff0c;想象一下在没有地图、…

家电用PCM板:市场现状研究分析与发展前景预测

家电PCM板属于一种兴起不久的功能性复合材料。属于家电复合外观材料中占比较大的一种。家电复合外观材料主要分为覆膜板&#xff08;VCM&#xff09;系列和有机涂层板&#xff08;PCM&#xff09;系列两大类&#xff1a;VCM系列表面复合各类功能性薄膜&#xff0c;可根据需要实…

湘大 XTU OJ 1214 A+B IV 题解:数位移动的本质+布尔变量标记+朴素模拟

一、链接 AB IV 二、题目 题目描述 小明喜欢做ab的算术&#xff0c;但是他经常忘记把末位对齐&#xff0c;再进行加&#xff0c;所以&#xff0c;经常会算错。 比如1213&#xff0c;他把12左移了1位&#xff0c;结果变成了133。 小明已经算了一些等式&#xff0c;请计算一下…

棒球游戏产业的发展·棒球1号位

棒球游戏产业的发展 1. 棒球游戏产业概述 棒球游戏产业的定义 棒球游戏产业是一个包罗万象的产业集群&#xff0c;涵盖了从基础设施到高端设备&#xff0c;从前沿技术研发到市场推广等各个环节。这个产业的繁荣得益于棒球运动的普及&#xff0c;人们对于棒球游戏的热情以及对…

0基础学C#笔记09:希尔排序法

文章目录 前言一、希尔排序的思想二、使用步骤总结前言 希尔排序可以说是插入排序的一种变种。无论是插入排序还是冒泡排序,如果数组的最大值刚好是在第一位,要将它挪到正确的位置就需要 n - 1 次移动。也就是说,原数组的一个元素如果距离它正确的位置很远的话,则需要与相…

linux cp -rpf指令

cp -rpf #强行递归复制/etc目录到/mist目录中&#xff0c;并保持源目录的权限等信息不变。 有点类似于打patch&#xff0c;不会改变已有的内容。

一次面试下来Android Framework 层的源码就问了4轮

说起字节跳动的这次面试经历&#xff0c;真的是现在都让我感觉背脊发凉&#xff0c;简直被面试官折磨的太难受了。虽然已经工作了七年&#xff0c;但是也只是纯粹的在写业务&#xff0c;对底层并没有一个很深的认识&#xff0c;这次面试经历直接的让我感受到我和那些一线大厂开…

揭秘!亚马逊美国站的热门品类有哪些?

做亚马逊跨境电商&#xff0c;做热门的品类是很最重要的&#xff0c;这样的市场需求量大&#xff0c;产品才能够更好的销售出去&#xff0c;不然的话选择冷门品类&#xff0c;就算你做到了第一&#xff0c;那销量一样不高。 在亚马逊跨境电商很多站点内都有热门品类&#xff0…

gateway做token校验

本文使用springcloud的gateway做token校验 登录的本质&#xff1a;拿用户名和密码 换 token。 token会返回给浏览器&#xff08;存储&#xff09;&#xff0c;当访问的时候&#xff0c;携带token 发起请求。 token校验图 引入redis依赖 <dependency><groupId>or…

vue3多条件搜索功能

搜索功能在后台管理页面中非常常见&#xff0c;本篇就着重讲一下vue3-admin-element框架中如何实现一个顶部多条件搜索功能 一、首先需要在vue页面的<template></template>中写入对应的结构 <!-- 搜索 --><div style"display: flex; justify-content…

HoG特征笔记

简介 HoG&#xff08;Histogram of Oriented Gradient&#xff09;&#xff0c;方向梯度直方图。HoG特征是一种特征描述符。它通过计算和统计图像局部区域的梯度方向直方图来描述特征。 HoG基于的底层原理是图像中局部目标的表象和形状&#xff08;appearance and shape&#x…

Java中VO,BO,PO,DO,DTO的区别

术语解释&#xff1a; VO&#xff08; View Object&#xff09;&#xff1a;显示层对象&#xff0c;通常是Web向模板渲染引擎层传输的对象。 BO&#xff08; Business Object&#xff09;&#xff1a;业务对象。 由Service层输出的封装业务逻辑的对象。 DO&#xff08; Data…