华为OD机试真题-字符串分割
题目描述:
给定非空字符串s,将该字符串分割成一些子串,使每个子串的ASCII码值的和均为水仙花数。
1、若分割不成功,则返回0。
2、若分割成功且分割结果不唯一,则返回-1。
3、若分割成功且分割结果唯一,则返回分割后子串的数目。
输入描述:1、输入字符串的最大长度为200。
输出描述:根据题目描述中情况,返回相应的结果。
补充说明:“水仙花数Q“是指一个三位数,每位上数字的立方和等于该数字本身,如371是"水仙花数",因为:371=33+73+1^3。
示例1,输入:,abc,输出:0,说明:分割不成功。
示例2,输入:f3@d5a8,输出:-1,说明:分割成功但分割结果不唯一,可以分割为两组,一组"f3"和"@d5a8",另外一组"f3@d5"。
代码实现:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class NarcissisticSubstringSplitter {// 判断一个整数是否是水仙花数private static boolean isNarcissistic(int number) {// 用于计算每个位上数字的立方和int sum = 0;// 临时变量,用于逐步取整数的每一位int temp = number;// 循环直到临时变量为0,遍历整数的每一位while (temp > 0) {// 获取当前位的数字int digit = temp % 10;// 将当前位数字的立方值累加到总和上sum += digit * digit * digit;// 临时变量缩小到下一位temp /= 10;}// 如果计算的立方和等于原始数字,则该数字是水仙花数return sum == number;}// 递归函数来尝试所有可能的子串分割private static void findSplits(String s, int start, List<String> currentSplit, Set<List<String>> resultSet) {// 当起始位置到达字符串末尾时,检查当前分割是否由自恋子串组成if (start == s.length()) {// 确保当前分割至少包含一个子串if (currentSplit.size() > 0) {// 假设所有子串都是自恋子串boolean allNarcissistic = true;// 遍历当前分割中的每个子串for (String subStr : currentSplit) {// 计算子串的ASCII值之和int asciiSum = 0;for (char c : subStr.toCharArray()) {asciiSum += (int) c;}// 如果子串的ASCII值之和不是自恋数,则标记为非自恋子串并跳出循环if (!isNarcissistic(asciiSum)) {allNarcissistic = false;break;}}// 如果当前分割中的所有子串都是自恋子串,则将其添加到结果集中if (allNarcissistic) {resultSet.add(new ArrayList<>(currentSplit));}}// 递归结束,返回上一级递归return;}// 尝试不同的子串分割位置for (int i = start; i < s.length(); i++) {// 获取从起始位置到当前位置的子串String subStr = s.substring(start, i + 1);// 将子串添加到当前分割中currentSplit.add(subStr);// 递归调用findSplits函数,尝试下一级子串分割findSplits(s, i + 1, currentSplit, resultSet);// 回溯,移除最后一个子串,尝试其他可能的分割currentSplit.remove(currentSplit.size() - 1);}}/*** 分割字符串成唯一大小的组* @param s 待分割的字符串* @return 返回分割结果的大小如果分割不成功返回0,如果分割结果不唯一返回-1,如果分割成功且结果唯一返回分割结果的大小*/public static int splitString(String s) {// 存储所有可能的分割结果的集合每个元素是一个分割方案的列表Set<List<String>> resultSet = new HashSet<>();// 当前的分割结果列表List<String> currentSplit = new ArrayList<>();// 递归查找所有可能的分割findSplits(s, 0, currentSplit, resultSet);// 如果集合为空,说明没有找到有效的分割方案if (resultSet.isEmpty()) {return 0; // 分割不成功} else if (resultSet.size() > 1) {// 如果集合大小大于1,说明有多个不同的分割方案,结果不唯一return -1; // 分割成功但分割结果不唯一} else {// 集合大小为1,说明找到了唯一的分割方案return resultSet.iterator().next().size(); // 分割成功且分割结果唯一}}public static void main(String[] args) {// 示例测试 System.out.println(splitString("abc")); // 输出: 0 System.out.println(splitString("f3@d5a8")); // 输出: -1 // 可以添加更多测试用例来验证 }
}
解释:
- isNarcissistic函数:判断一个整数是否是水仙花数。
- findSplits函数:递归函数,尝试所有可能的子串分割,并检查这些子串的ASCII码值之和是否都是水仙花数。使用回溯法来尝试所有可能的分割。
- splitString函数:调用findSplits函数,并根据结果集的大小返回相应的结果。
注意:上述代码中的isNarcissistic函数是用来判断一个整数是否是水仙花数,但在实际分割过程中,我们计算的是子串中字符ASCII码值的和。因此,在findSplits函数中,我们计算了每个子串的ASCII码值之和,并检查其是否为水仙花数。
测试用例:
- 输入"abc",输出0,因为无法分割成ASCII码值之和为水仙花数的子串。
- 输入"f3@d5a8",输出-1,因为可以分割成多组满足条件的子串(尽管在这个例子中,“f3"和”@d5a8"的ASCII码值之和并不是水仙花数,但示例可能只是为了说明可以有多种分割方式,而实际代码会正确计算ASCII码值之和并检查水仙花数)。实际上,根据ASCII码值和的计算,"f3@d5a8"这样的字符串很难直接分割成满足条件的子串,但代码逻辑是正确的,可以根据实际需求调整或添加更多测试用例。
相关文章:
华为OD机试真题-字符串分割
题目描述: 给定非空字符串s,将该字符串分割成一些子串,使每个子串的ASCII码值的和均为水仙花数。 1、若分割不成功,则返回0。 2、若分割成功且分割结果不唯一,则返回-1。 3、若分割成功且分割结果唯一,则返…...
编程技巧:提高代码健壮性与可维护性的关键方法(以 Shell 为例)
在脚本编写和自动化工作中,良好的编程技巧对于确保代码的健壮性和可维护性至关重要。以下是一些关键的编程技巧,包括模块化设计、单元测试、版本控制、处理边界条件、错误处理、中间值保存和创建 Flag。本文将通过 Shell 脚本示例来阐述这些技巧的应用。 1. 模块化设计 **定…...
【无标题】ReadableStream is not defined
升级 node 版本到 18 及以上即可解决...
【JVM】高级篇
1 GraalVM 1.1 什么是GraalVM GraalVM是Oracle官方推出的一款高性能JDK,使用它享受比OpenJDK或者OracleJDK更好的性能。 GraalVM的官方网址:https://www.graalvm.org/ 官方标语:Build faster, smaller, leaner applications。 更低的CPU…...
nacos1.4源码-服务发现、心跳机制
nacos的服务发现主要采用服务端主动推送客户端定时拉取;心跳机制通过每5s向服务端发送心跳任务来保活,当超过15s服务端未接收到心跳任务时,将该实例设置为非健康状态;当超过30s时,删除该实例。 1.服务发现 nacos主要采…...
C++ 2D平台游戏开发案例
关于2D平台游戏的C开发案例,包括游戏设计、实现细节、图形渲染和音效处理等内容。虽然无法一次性提供3000字,但我会尽量详细描述各个部分,并确保有足够的深度和广度。 2D平台游戏开发案例 一、游戏设计 游戏概述 游戏名称:“冒险…...
【Webpack--019】TreeShaking
🤓😍Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-前端领域博主 🐱🐉若此文你认为写的不错,不要吝啬你的赞扬,求收藏,求评论,求一个大大的赞!👍* &#x…...
Docker基本操作命令
Docker 是一个开源的应用容器引擎,允许开发者打包应用以及其依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。主要功能是为开发者提供一个简单…...
开源计算器应用的全面测试计划:确保功能性和可靠性
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
uni.requestPayment 支付成功之后会走 wx.onAppRoute
uni.requestPayment 是用于发起微信支付的统一接口,而 wx.onAppRoute 是用于监听小程序的路由变化。当 uni.requestPayment 支付成功后,如果发生了页面跳转或者其他路由变化,wx.onAppRoute 会被触发。这个行为是正常的,因为支付成…...
统⼀服务入口 - Gateway
网关介绍 问题 在 spring cloud 体系中我们通过 Eureka,Nacos 解决了服务注册,服务发现的问题,使⽤Spring Cloud LoadBalance解决了负载均衡的问题,使⽤ OpenFeign 解决了远程调⽤的问题. 但是当前所有微服务的接⼝都是直接对外暴露的,可以直接通过外部访问.为了保证对外服务的…...
QGraphicsWidget Class
Header:#include < QGraphicsWidget > qmake:QT += widgets Since:Qt 4.4 Inherits:QGraphicsObject and QGraphicsLayoutItem Inherited By:QGraphicsProxyWidget This class was introduced in Qt 4.4. Public Types enum anonymous {Type }Properties autoFi…...
探讨最好用的AI工具:从日常到创新的应用
文章目录 引言常用AI工具1. 语音助手2. 图像识别软件3. 机器翻译工具4. 智能客服系统 创新AI应用1. 自动驾驶汽车2. 虚拟试衣间3. 医疗影像分析4. 个性化推荐系统 个人体验分享1. 通义灵码2. 文心一言3. 智能写作助手4. 智能家居设备5. DALLE6. Whisper7. Codex8. Gym9. ChatGP…...
Python系统教程005(字符串的格式化输出)
知识回顾 1、默认情况下,input函数接收的数据是字符串类型。 2、字符串类型的关键词是str。 3、\n和\t都是转义字符,\n用来换行,\t用来留出一段固定长度的空白。 4、type函数能够用来查看变量的数据类型 5、数据类型的转换,举…...
六款电脑远程控制软件分享,2024最热门软件合集,总有一款适合你!速来看!
想要随时随地控制自己的电脑? 无论你是办公需求,还是要远程协助他人,一款好用的远程控制软件绝对少不了。 2024年最热门的六款远程控制软件已经为你准备好,总有一款适合你,赶快往下看吧! 1. 安企神系统—…...
优质微信群不再难寻!掌握这些技巧就够了!
在当今信息爆炸的时代,微信群已成为人们交流思想、分享知识、建立人脉的重要平台。无论是专业领域的深入探讨,还是兴趣爱好的自由交流,微信群都能为你提供一个即时互动的虚拟空间。然而,面对海量的微信群信息,如何高效…...
python - mysql操作
Python MySQL 操作 1. 背景介绍 常见的Mysql驱动介绍: MySQL-python:也就是MySQLdb。是对C语言操作MySQL数据库的一个简单封装。遵循了Python DB API v2。但是只支持Python2,目前还不支持Python3。mysqlclient:是MySQL-python的…...
基于Springboot+Vue的服装生产管理信息系统设计与实现(含源码数据库)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 在这个…...
75.【C语言】文件操作(2)
承接74.【C语言】文件操作(1)文章 目录 5.详细阐释文件的打开和关闭 1.流 2.标准流 3.文件指针 FILE 两层含义 附:FILE的头文件 4.操作文件的步骤 1.fopen函数 编辑 简写的全称查询 输入&输出的含义 2.fclose函数 3.代码示例 补充:绝对路径和相对路径 注意…...
Redis 使用记录
封装调用redis类 import redis from conf.config import RedisConfigclass RedisConfig:redis_json config_data[redis_config]redis_pwd env.get(project_name).get(pwd)host redis_json.get("host")dialog_states_db redis_json.get("dialog_states_db&q…...
NAS-FPN里的GP和Sum Cell到底怎么工作的?手把手图解MMCV源码实现
NAS-FPN中的GP与Sum Cell工作机制解析:从理论到MMCV源码实现 在目标检测领域,特征金字塔网络(FPN)已经成为处理多尺度目标的标配组件。然而传统FPN采用固定的人工设计结构,难以适应不同检测任务的需求。NAS-FPN通过神经网络结构搜索技术&…...
别再复制粘贴了!手把手教你用C语言实现MODBUS CRC-16校验(附5种算法对比)
MODBUS CRC-16校验算法实战指南:从原理到最优实现选择 在工业自动化领域,MODBUS协议因其简单可靠而广泛应用,而CRC-16校验则是保障数据完整性的关键环节。许多开发者习惯直接复制网络上的校验代码,却常常遇到内存溢出、性能瓶颈或…...
点支式玻璃幕墙张拉索杆结构设计原理
点支式玻璃幕墙张拉索杆结构设计原理 一、问题的提出 张拉索杆结构点支式玻璃幕墙在我国使用时间虽然不长,但其发展相当迅猛,2002年达到年使用量约70万m2。我们必须清醒的看到此类结构在国内出现时间不长,同工程应用相比,理论研究相对滞后,对此类结构还缺乏深入研究,…...
告别AWCC臃肿:500KB轻量级Alienware灯光风扇控制终极方案
告别AWCC臃肿:500KB轻量级Alienware灯光风扇控制终极方案 【免费下载链接】alienfx-tools Alienware systems lights, fans, and power control tools and apps 项目地址: https://gitcode.com/gh_mirrors/al/alienfx-tools 厌倦了Alienware Command Center&…...
Android Studio中文界面完整汉化指南:三步打造母语开发环境
Android Studio中文界面完整汉化指南:三步打造母语开发环境 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为And…...
显卡驱动彻底清理指南:DDU工具拯救你的显示问题![特殊字符]
显卡驱动彻底清理指南:DDU工具拯救你的显示问题!🚀 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-d…...
新手避坑指南:你的FPGA按键消抖仿真为什么和板子对不上?
FPGA按键消抖实战:从仿真完美到真实失效的深度排查手册 刚接触FPGA开发的工程师常会遇到一个诡异现象:按键消抖模块在ModelSim里跑得风生水起,波形干净漂亮,可一旦下载到开发板就各种失灵——要么按键没反应,要么按一次…...
企业级AI应用在虚拟机集群的部署,如何借助Taotoken统一API网关
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 企业级AI应用在虚拟机集群的部署,如何借助Taotoken统一API网关 在构建企业内部的AI应用时,一个常见的架构是…...
EEG情感分析入门:如何用DEAP数据集里的脑电波区分‘开心’和‘平静’?
EEG情感分析实战:从DEAP数据集解码快乐与平静的脑电密码 当你听到最喜欢的歌曲时,大脑会产生怎样的电信号变化?神经科学研究表明,不同的情绪状态会在大脑活动中留下独特的"指纹"。本文将带你探索如何利用DEAP数据集中的…...
负载电阻从500Ω到10kΩ:用Multisim深度解读谐振放大器选择性变化的底层逻辑
负载电阻从500Ω到10kΩ:用Multisim深度解读谐振放大器选择性变化的底层逻辑 在电子电路设计中,谐振放大器是一个经典而重要的电路结构。许多工程师和爱好者都能熟练地搭建电路并进行基础测试,但当被问及"为什么负载电阻的变化会影响放大…...
