美团2024届秋招笔试第一场编程真题——小美的字符串变换

小美拿到了一个长度为n的字符串,她希望将字符串从左到右平铺成一个矩阵(先平铺第一行,然后是第二行,以此类推,矩阵有x行y列,必须保证x∗y=n,即每y个字符换行,共x行)。

该矩阵的权值定义为这个矩阵的连通块数量。小美希望最终矩阵的权值尽可能小,你能帮小美求出这个最小权值吗?

注:我们定义,上下左右四个方向相邻的相同字符是连通的。

输入描述:

第一行输入一个正整数n,代表字符串的长度。
第二行输入一个长度为n的、仅由小写字母组成的字符串。
1<=n<=10000

输出描述:

输出一个整数表示最小权值。

示例1

输入例子:
9
aababbabb输出例子:
2例子说明:
平铺为3*3的矩阵:
aab
abb
abb
共有2个连通块,4个a和5个b。
private static final int[][] DIRECTIONS = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};private static void dfs(char[][] block, boolean[][] visited, int i, int j, int x, int y) {visited[i][j] = true;for (int[] direction : DIRECTIONS) {int ni = i + direction[0], nj = j + direction[1];if (ni >= 0 && nj >= 0 && ni < x && nj < y && !visited[ni][nj] && block[i][j] == block[ni][nj]) {dfs(block, visited, ni, nj, x, y);}}
}public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);int n = sc.nextInt();sc.nextLine();//需要读取并丢弃剩余的换行符!因为scanner.nextInt()方法只读取整数,不读取后面的换行符String str = sc.nextLine();//scanner.nextLine()会读取整行的输入包括空格,直到遇到换行符 scanner.next()则只会读取一个单词,即直到遇到空格或换行符。//先根据n求出所有可能的x和yint ans = 10005, sqrt = (int) Math.sqrt(n);ArrayList<int[]> list = new ArrayList<>();for (int i = 1; i <= sqrt; i++) {if (n % i == 0) {list.add(new int[]{i, n / i});list.add(new int[]{n / i, i});}}if (sqrt * sqrt == n) list.remove(list.size() - 1);//根据所有的x和y来构建矩阵for (int[] ints : list) {int x = ints[0], y = ints[1], block_num = 0;char[][] block = new char[x][y];//矩阵boolean[][] visited = new boolean[x][y];//标记矩阵每个点是否被检查过for (int i = 0; i < x; i++) {for (int j = 0; j < y; j++) {block[i][j] = str.charAt(i * y + j);}}//根据构建的矩阵求出最小连通量for (int i = 0; i < x; i++) {for (int j = 0; j < y; j++) {if (!visited[i][j]) {dfs(block, visited, i, j, x, y);block_num++;}}}ans = Math.min(ans, block_num);}System.out.println(ans);
}

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

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

相关文章

2024.2.21 模拟实现 RabbitMQ —— 实现转发规则

目录 需求分析 直接交换机&#xff08;Direct &#xff09; 主题交换机&#xff08;Topic &#xff09; 扇出交换机&#xff08;Fanout &#xff09; Topic 交换机转发规则 routingKey 组成 bindingKey 组成 匹配规则 情况一 情况二 情况三 实现 Router 类 校验 b…

Spring Boot application.properties和application.yml文件的配置

在Spring Boot中&#xff0c;application.properties 和 application.yml 文件用于配置应用程序的各个方面&#xff0c;如服务器端口、数据库连接、日志级别等。这两个文件是Spring Boot的配置文件&#xff0c;位于 src/main/resources 目录下。 application.properties 示例 …

vue中动态表格中文校验,但是中文的参数无法获取

场景&#xff1a; 解决方案&#xff1a; 因为上述的正则表达式后&#xff0c;使用搜狗输入法没有问题&#xff0c;但采用微软自带输入法后&#xff0c;会存在输入数字及英文时为正常&#xff0c;切换为汉字后&#xff0c;会存在吞并当前光标前的字符。具体吞并个数和输入法中有…

Unity发布webgl获取浏览器的URL

Unity发布webgl获取浏览器的URL Unity发布webgl之后获取浏览器的url 在unity中创建文件夹Plugins&#xff0c;然后添加添加文件UnityGetBrowserURL.jslib var GetUrlFunc {//获取地址栏的URLStringReturnValueFunction: function () {var returnStr window.top.location.hre…

SpringBoot3整合Swagger3,访问出现404错误问题(未解决)

秉承着能用就用新的的理念&#xff0c;在JDK、SpringBoot、SpringCloud版本的兼容性下&#xff0c;选择了Java17、SpringBoot3.0.2整合Swagger3。 代码编译一切正常&#xff0c;Swagger的Bean也能加载&#xff0c;到了最后访问前端页面swagger-ui的时候出现404。 根据网上资料…

Oracle ADG相关介绍

文章目录 一、ADG原理1、ADG介绍2、ADG搭建流程 二、ADG相关参数三、增量修复 一、ADG原理 1、ADG介绍 Oracle ADG&#xff08;Advanced Data Guard&#xff09;是Oracle数据库的一项高可用和灾难恢复技术&#xff0c;它通过将数据保持在物理备库中来提供数据保护和容灾能力。…

关于前后端分离框架的一些疑问

1.既然前后端分离框架已经成为主流框架&#xff0c;那么前后端不分离框架存在的意义是什么? 简化开发: 对于一些简单的应用或者团队实力较弱的情况下&#xff0c;前后端不分离的框架可能更容易上手和开发&#xff0c;因为它将前端和后端的逻辑都集中在了一起&#xff0c;减少…

如何拆分express项目中app.js中的路由

由于项目越来越大&#xff0c;app.js中的路由会变多&#xff0c;导致app.js文件变大&#xff0c;需要提取出路由。 如何拆分 app.js文件 导入路由文件调用路由文件&#xff0c;调用的时候传入参数app const baseRouter require(./routes/router); baseRouter(app);routes/…

StringBuffer StringBuilder

String 为什么StringBuilder是线程不安全的&#xff1f;StringBuffer是线程安全的&#xff1f; - Jacian - 博客园 (cnblogs.com) StringBuilder 线程安全的可变字符学序列 速度快 StringBuffer 线程不安全的可变字符序列 创建StringBuilder对象 new StringBuilder&…

c++面试一

1.#include使用 在C/C中&#xff0c;#include 预处理指令用于包含头文件&#xff0c;这些头文件通常包含了函数声明、宏定义以及其他的声明和定义。#include 指令后面跟着的文件名可以使用双引号 "" 或尖括号 <> 来指定&#xff0c;它们之间有一些区别。 双引…

Qt QWiget 实现简约美观的加载动画 第三季

&#x1f603; 第三季来啦 &#x1f603; 这是最终效果: 只有三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #include <QGridLayout> int main(int argc, char *argv[]…

设计并实现一个并发安全的LRU(Least Recently Used,最近最少使用)缓存结构

文章目录 前言实战演示写在最后 前言 相信很多人都使用过LinkedHashMap&#xff0c;LinkedHashMap中的removeEldestEntry可以删除老旧的元素&#xff0c;我们可以以此来实现一个LRU缓存结构&#xff0c;并结合java中JUC包中的各种多线程锁机制来保证多线程安全。 以下是我遇见…

过滤器和拦截器的区别是什么

过滤器和拦截器都是Web应用程序中的常用组件&#xff0c;不过它们的功能和使用方式不同。 1.工作位置不同 过滤器在Servlet容器内部工作 拦截器在SpringMVC框架内部工作 2.触发时间不同 过滤器在客户端向服务器发送请求前触发&#xff0c;在请求到达Servlet容器之前进行处理…

突破编程_C++_面试(模板编程(2))

面试题 1 &#xff1a;什么是模板特化&#xff1f;为什么需要它&#xff1f; 模板特化是C编程语言中的一个概念&#xff0c;它允许我们为模板定义特定类型的版本。简单来说&#xff0c;模板特化是模板的具体化&#xff0c;它允许为特定的类型提供特定的实现。 模板特化主要有…

【前端素材】推荐优质后台管理系统Dashmin平台模板(附源码)

一、需求分析 后台管理系统在多个层次上提供了丰富的功能和细致的管理手段&#xff0c;帮助管理员轻松管理和控制系统的各个方面。其灵活性和可扩展性使得后台管理系统成为各种网站、应用程序和系统不可或缺的管理工具。 后台管理系统是一种具有多层次结构的软件系统&#xf…

主从边沿触发寄存器、SRAM、DRAM

主从边沿触发寄存器SRAMDRAM

工厂设计模式总结

一、简单工厂 1.1 概述 背景&#xff1a; 代码中存在根据不同条件创建不同对象的场景。例如&#xff1a; if ("json".equals(name)) {return new JsonConfigParser(); } else if ("xml".equals(name)) {return new XmlConfigParser(); } else if ("…

邀请函 | 2024年数据技术嘉年华集结号已吹响,期待您参会!

龙腾四海内&#xff0c;风云际会时&#xff0c;2024年中国数据嘉年华如约而至。从起初小范围的网友聚会&#xff0c;到如今面向全国各地从业者、爱好者的年度集会&#xff0c;纵使岁月更迭&#xff0c;我们初心依旧。我们在各自最好的年华里共同见证了中国数据库行业的蓬勃发展…

Linux下的IO多路复用

文章目录 一. IO的概念和分类1. IO操作的原理&#xff1a;二. I/O多路复用使用场景和作用1. 问题&#xff1a; 一台网络服务器需要接收100台客户端的连接和数据通信&#xff0c;应该如何设计和实现&#xff1f;2. I/O多路复用机制&#xff1a; 三. Select poll epollselectpoll…

【前端素材】推荐优质后台管理系统Modernize平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理和控制网站、应用程序或系统后台操作的软件工具&#xff0c;通常由授权用户&#xff08;如管理员、编辑人员等&#xff09;使用。它提供了一种用户友好的方式来管理网站或应用程序的内容、用户、数据等方面的操作&#xff0c;并且通常…