Java:路径计算与障碍物处理

news2024/11/23 7:02:39

Java 实现寻找字符串数组中的最长公共前缀及不同路径数量计算(含障碍物)

在计算机科学和软件开发中,经常需要解决一些基本但实用的问题。本文将介绍两种常见问题的解决方案:一是从一组字符串中找出最长公共前缀;二是计算在一个存在障碍物的网格中从起点到终点的不同路径数量。我们将通过具体的 Java 代码实现来探讨这两种问题的解决方法。
最长公共前缀的寻找方法,水平扫描和分而治之,考验程序员逻辑思维和编码技巧

寻找字符串数组中的最长公共前缀

在编程领域,我们不时地面临挑战,如从一系列字符串中寻找它们的最长公共前缀。

本篇文章旨在介绍一个既简便又高效的算法来应对这一挑战,并通过Java语言的代码示例进行阐释。

问题描述

给定一个字符串数组 strs,要求找到其中所有字符串的最长公共前缀。如果不存在公共前缀,则返回空字符串 ""

解决方案

为了找到字符串数组中的最长公共前缀,我们可以采用以下策略:

  1. 首先检查数组是否为空,如果是,则直接返回空字符串。
  2. 使用一个索引变量 i 逐字符地比较字符串。
  3. 创建一个 StringBuilder 对象来构建公共前缀。
  4. 通过一个无限循环 while (true) 来逐字符比较,并在适当的条件下使用 break 语句退出循环。
  5. 在每次循环中,检查当前索引 i 是否超出了数组中任意一个字符串的长度。如果是,则说明已无法找到更长的公共前缀,退出循环。
  6. 逐个比较字符串数组中的每个字符串,确保当前索引 i 处的字符在所有字符串中都相同。
  7. 如果当前字符在所有字符串中都相同,则将其添加到 StringBuilder 中,并将索引 i 增加 1。
  8. 如果发现不匹配的字符,则设置标志变量 donetrue 并退出循环。

代码实现

下面是具体的 Java 代码实现:

public class Solution {
    public String longestCommonPrefix(String[] strs) {
        // 如果字符串数组为空,则返回空字符串
        if (strs.length == 0) {
            return "";
        }
        
        int index = 0;
        StringBuilder lcp = new StringBuilder();
        
        // 使用无限循环来逐字符比较
        while (true) {
            boolean done = false;
            // 如果当前索引超出第一个字符串的长度,则停止
            if (index >= strs[0].length()) {
                break;
            }
            
            // 逐个比较字符串数组中的每个字符串
            for (int j = 0; j < strs.length; j++) {
                // 如果当前索引没有超出字符串的长度
                if (index < strs[j].length()) {
                    // 如果当前字符与第一个字符串的当前字符不同,则停止
                    if (strs[j].charAt(index) != strs[0].charAt(index)) {
                        done = true;
                        break;
                    }
                } else {
                    // 如果当前索引超出了字符串的长度,则停止
                    done = true;
                    break;
                }
            }
            
            // 如果发现不匹配的字符,则停止
            if (done) {
                break;
            } else {
                // 将当前字符添加到公共前缀中
                lcp.append(strs[0].charAt(index));
                index++;
            }
        }
        
        // 返回构建好的最长公共前缀
        return lcp.toString();
    }
}

示例

假设输入的字符串数组为 ["flower","flow","flight"]

  • 第一个字符 'f' 在所有字符串中都相同,因此加入到 lcp 中。
  • 第二个字符 'l' 也在所有字符串中相同,因此继续加入到 lcp 中。
  • 第三个字符 'o' 也在所有字符串中相同,继续加入。
  • 第四个字符 'w' 只在 "flower""flow" 中出现,但在 "flight" 中不是 'w',因此循环结束。

最终得到的最长公共前缀为 "fl"

图论与算法优化,为导航系统提供数据支持

不同路径数量计算(含障碍物)

在计算机科学中,路径问题是经常遇到的一类问题,特别是在算法和数据结构的学习过程中。本文将探讨如何在一个网格中计算从左上角到右下角的不同路径数量,并考虑某些格子可能存在障碍物的情况。我们将通过具体的 Java 代码实现来解决这个问题。

问题描述

给定一个 m x n 的二维网格 obstacleGrid,其中 1 表示障碍物,0 表示空地。要求计算从左上角 (0, 0) 到右下角 (m-1, n-1) 的路径数量,只能向下或向右移动。如果路径上有障碍物,则不能通过该路径。

动态规划思路

  1. 边界条件:如果起点有障碍物,则无解;如果终点有障碍物,则到达终点的路径数为 0。
  2. 初始化:对于第一行和第一列,如果没有遇到障碍物,则路径数始终为 1;一旦遇到障碍物,后续的所有格子路径数均为 0。
  3. 递推公式:对于其他格子,如果遇到障碍物,路径数为 0;否则,路径数等于上方格子和左方格子路径数之和。

代码实现

下面是具体的 Java 代码实现:

public class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;

        // 如果起点有障碍物,直接返回 0
        if (obstacleGrid[0][0] == 1) {
            return 0;
        }

        // 初始化路径计数数组
        int[][] paths = new int[m][n];

        // 初始化第一列
        for (int i = 0; i < m; i++) {
            if (obstacleGrid[i][0] == 1) {
                // 如果遇到障碍物,后续所有格子路径数为 0
                break;
            }
            paths[i][0] = 1;
        }

        // 初始化第一行
        for (int j = 0; j < n; j++) {
            if (obstacleGrid[0][j] == 1) {
                // 如果遇到障碍物,后续所有格子路径数为 0
                break;
            }
            paths[0][j] = 1;
        }

        // 计算其他格子的路径数
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (obstacleGrid[i][j] == 1) {
                    // 如果遇到障碍物,路径数为 0
                    paths[i][j] = 0;
                } else {
                    // 路径数等于上方格子和左方格子路径数之和
                    paths[i][j] = paths[i][j - 1] + paths[i - 1][j];
                }
            }
        }

        // 返回终点的路径数
        return paths[m - 1][n - 1];
    }
}

示例

假设输入的网格为:

[
  [0, 0, 0],
  [0, 1, 0],
  [0, 0, 0]
]
  • 第一行和第一列的路径数分别为 [1, 1, 1][1, 1, 0],因为在 (1, 0) 处遇到了障碍物。
  • 其他格子的路径数依次计算为:
    • (1, 1) 处有障碍物,路径数为 0。
    • (2, 1) 处的路径数为 paths[1][1] + paths[2][0] = 0 + 1 = 1
    • (2, 2) 处的路径数为 paths[2][1] + paths[1][2] = 1 + 0 = 1

最终结果为 1

总结

通过动态规划的方法,我们可以有效地计算出在一个存在障碍物的网格中从起点到终点的不同路径数量。这种方法不仅简洁明了,而且效率高,适用于各种规模的问题。无论是对于学习还是实际应用,这种算法都非常有用。在这里插入图片描述

希望本文能帮助你更好地理解和掌握这两种经典问题的解决方法。通过这两个例子,我们可以看到,通过合理的算法设计和优化,可以解决许多实际问题,并提高程序的性能。

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

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

相关文章

能力驱动的企业战略转型:基于能力规划的战略转型与数字化实践全指南

在当今数字化和全球化加速发展的时代&#xff0c;企业面临着复杂的市场环境和迅速变化的客户需求。为了在竞争中脱颖而出&#xff0c;企业必须不仅制定卓越的战略&#xff0c;还需确保这些战略能够有效地转化为实际行动。基于能力规划&#xff08;Capability-Based Planning, C…

Lua 代码编码规范

lua代码格式 vscode stylua 插件 配置文件stylua.toml column_width 240 line_endings “Unix” indent_type “Spaces” --使用空格 很重要&#xff0c;保证不同编辑器打开是一样的 indent_width 4 quote_style “AutoPreferDouble” --字符串引号样式双引号 call_paren…

海康二次开发学习笔记9-通讯触发及模块列表获取

通讯触发及模块列表获取 模块列表获取 获取流程中所有模块的模块名,添加下拉框用于显示模块名 1. 处理Combox2的DropDown事件 /// <summary>/// 模块列表获取/// </summary>/// <param name"sender"></param>/// <param name"e&q…

MCU官方IDE软件安装及学习教程集合 — STM32CubeIDE(STM32)

简介 各MCU厂商为保证产品的市场地位以及用户体验&#xff0c;不断的完善自己的产品配套&#xff0c;搭建自己的开发生态&#xff0c;像国外ST公司&#xff0c;国内的GD&#xff08;兆易创新&#xff09;&#xff0c;AT&#xff08;雅特力&#xff09;等等。目前就开发生态而言…

测试.net core服务项目调用dotNetify-Pulse监控性能的基本用法

微信公众号“DotNet讲堂”的文章《开源 .NET API 实时监控项目》介绍了开源实时日志及性能监控项目dotNetify-Pulse&#xff0c;在项目中引用简单&#xff0c;既能用其自带的监控页面&#xff0c;也支持按需配置监控页面。本文在之前创建的环境检测项目中添加并测试dotNetify-P…

逆向工程核心原理 Chapter20 | “内嵌补丁”练习

前言 自己学《逆向工程核心原理》一书的记录&#xff0c;只记录自己觉得重要/有用的一些点。 知识点学习 很实用的一个逆向技术。 原理&#xff1a; “壳”的逻辑也是这样的。EP处先解密OEP代码&#xff0c;再跳转到洞穴代码&#xff0c;恢复IAT之类的&#xff0c;然后跳回…

免费分享-MATLAB代码融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型

融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型 通过融合正余弦和柯西变异改进麻雀搜索算法&#xff0c;对CNN-BiLSTM的学习率、正则化参数以及BiLSTM隐含层神经元个数等进行优化 预测效果图如下 代码如下&#xff1a; %% 清空环境变量 wa…

Vue(七) TodoList案例1.0

文章目录 组件化编码流程(通用)1. 拆分静态组件2. 初始化列表展示动态数据如何让一个标签动态的拥有某一个属性 3. 按回车添加todo子组件给父组件传值之props 4. 勾选与取消勾选一个Todo5. 删除6. footer底部统计7. footer底部交互7.1 全选框自动打勾7.2 全选框取消勾选 8. 清除…

【java】vscode配置javaweb开发环境

下载jdk https://www.oracle.com/java/technologies/downloads/?er221886下载完毕直接安装&#xff0c;安装完毕自动添加以下环境变量 在cmd中运行 java -version出现以下代表成功 再添加系统变量 下载Maven https://maven.apache.org/download.cgi下载完解压放到自己方…

win10环境下gvim离线配置插件的一些补充

0 总述 在上一篇博客&#xff0c;即《Windows系统下使用gvim配置LaTeX快速书写环境》一文中&#xff0c;本小白试图模仿神级人物Gilles Castel&#xff0c;打造vim下的 LaTeX \LaTeX LATE​X书写环境。实话实说&#xff0c;东施效颦了。虽不至于一无所得&#xff0c;但也仅仅算…

STM32通过ADM3222完成UART转232通信电平转换

1、简介 单片机默认串口输出电平是UART信号,但是在实际项目中经常需要将其转换成232电平,此时就需要ADM3222芯片来完成电平的转换,下面对使用过程进行总结。 2、硬件电路 从上图中可以看到芯片需要对1、18进行配置才能进行工作,通过查阅手册可知,1引脚需要配置低电平,…

生物信息学:DNA序列的构成

DNA序列是由一串字母表示的真实的或者假设的携带基因信息的DNA分子的一级结构。‌ DNA序列的构成基于四种特定的碱基&#xff0c;分别是腺嘌呤&#xff08;A&#xff09;、胸腺嘧啶&#xff08;T&#xff09;、鸟嘌呤&#xff08;G&#xff09;和胞嘧啶&#xff08;C&#xff…

【机器学习】K近邻(K-Nearest Neighbors,简称KNN)的基本概念以及消极方法和积极方法的区别

引言 K近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;算法是一种基础的机器学习方法&#xff0c;属于监督学习范畴 文章目录 引言一、K近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;1.1 原理详述1.1.1 距离度量1.1.2 选择k值1.1.…

django网吧收费管理系统 项目源码26819

摘 要 随着互联网的普及&#xff0c;网吧作为公共互联网接入场所&#xff0c;依旧在许多地区发挥着重要作用。现代网吧不仅仅是提供上网服务的场所&#xff0c;还包括了游戏、社交、休闲等多功能体验。为了提高网吧的服务质量和运营效率&#xff0c;迫切需要一个高效的管理系统…

采集工具选型调研

原文阅读&#xff1a;【巨人肩膀社区博客分享】采集工具选型调研 大家一起来探讨SeaTunnel方案&#xff0c;简化当前Dinky与chunjun的双轨模式&#xff08;Dinky仅用于实时同步&#xff0c;chunjun负责离线处理&#xff09;。提议小组一起共议&#xff0c;并由大数据组构建dem…

大模型battle,哪家才是真的“价美”也“物美”

大模型battle&#xff0c;哪家才是真的“价美”也“物美” 物美价廉何为物美价廉大模型battle基础能力测试&#xff1a;专业能力测试&#xff1a;中文特性能力测试&#xff1a;逻辑推理能力测试&#xff1a;创新能力测试&#xff1a;安全性与合规性测试&#xff1a;写在最后 近…

【Qt窗口】—— 对话框

目录 &#xff08;一&#xff09; 对话框介绍 &#xff08;二&#xff09;对话框的分类 2.1 模态对话框 2.2 非模态对话框 2.3 混合属性对话框 &#xff08;三&#xff09;内置对话框 消息对话框 QMessageBox 颜色对话框 QColorDialog 字体对话框 QFontDialog 输入对…

RK3588 系列之1—串口连接

RK3588 系列之1—串口连接 1.串口转USB芯片驱动2.使用MobaXterm进行串口链接3.注意事项 1.串口转USB芯片驱动 根据使用的芯片安装不同的驱动&#xff0c;常见的如CH340。装完驱动后&#xff0c;通过设备管理器&#xff0c;查看开发板与个人PC连接情况&#xff0c;记住占用的端…

超声波智能水表通讯方式有哪些?

超声波智能水表采用多种通讯方式实现数据传输&#xff0c;包括但不限于有线连接、无线网络、以及短距离无线通信技术&#xff0c;这些方式各有优劣&#xff0c;适用于不同的应用场景。 一、通讯方式概述 1.有线通讯 -RS-485接口&#xff1a;这是一种半双工的串行通信接口标准…

微服务框架二

微服务 微服务技术栈 服务发现概念 服务发现两种方式 客户端发现 服务端服务发现 服务发现技术对比 Nacos架构图 基于dubbo nacos服务调用 Nacos核心源码解析 registery 具体实现在nacosServiceRegistery setbeat 返回clientBeatInterval