打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
华为OD机试真题Java实现【水仙花数2】真题+解题思路+代码(2022&2023)
userphoto

2023.03.15 福建

关注

水仙花数2

题目

给定非空字符串s,将该字符串分割成一些子串
使每个子串的ASCII码值的和均为水仙花数

  1. 若分割不成功则返回0
  2. 若分割成功且分割结果不唯一 则返回-1
  3. 若分割成功且分割结果唯一 则返回分割后子串的数目

🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Java)真题目录汇总

输入

输入字符串的最大长度为200

输出描述

根据题目中的情况返回响应结果

示例一

输入

abc

输出

0

说明

分割不成功

示例二

输入

f3@d5a8

输出

-1

说明

分割成功但分割结果不唯一
可以分割为两组
一组 f3和@d5a8
另一组 f3@d5和a8

说明

分割不成功

示例三

输入

AXdddF

输出

2

说明

成功分割且分割结果唯一
可以分割为AX(153)dddF(370)两个子串

解题思路

通过输入一个字符串来寻找水仙数。水仙数是指一个三位数,它的各位数字的立方和等于它本身。程序首先定义了一个链表resultLinklist来储存找到的结果,然后定义了一个方法isWaterNum来判断一个数是否为水仙数,又定义了一个方法getStringAsciiSum来计算一个字符串中每个字符对应的ASCII码值之和。接下来是findData方法,它使用递归的方式来寻找符合条件的数。该方法将输入字符串分割成两个子串subStrOne和subStrTwo,并检查这两个子串的ASCII码值之和是否为水仙数。如果都是,则将其加入resultLinklist中;如果只有subStrOne是水仙数,则继续在subStrTwo上调用findData方法;如果都不是,则跳过当前循环。最后,在main方法中读取用户输入的字符串,调用findData方法处理,并输出结果。主要使用的Java集合是LinkedList。知识点包括字符串操作、递归、流程控制语句等。

代码实现

package com.hw.od;

import java.util.LinkedList;
import java.util.Scanner;

/**
 * Author: 华为OD联盟(梦想橡皮擦,码莎拉蒂,鸿蒙坚果) Date: 2023/1/6 Time: 19:38 Description:
 */

public class OdMain {
	public static LinkedList<Integer> resultLinklist = new LinkedList<>();
	public static boolean isWaterNum(int num) {
		int a = num % 10;
		int b = num / 10 % 10;
		int c = num / 100;
		return a * a * a + b * b * b + c * c * c == num;
	}
	public static int getStringAsciiSum(String s) {
		int result = 0;
		for (char c : s.toCharArray()) {
			result += c;
		}
		return result;
	}
	public static void findData(String values, int number) {
		String subStrOne;
		String subStrTwo;
		for (int j = 1; j < values.length(); ++j) {
			 subStrOne = values.substring(0, j);
			 subStrTwo = values.substring(j);
			if (isWaterNum(getStringAsciiSum(subStrOne))) {
				if (isWaterNum(getStringAsciiSum(subStrTwo))) {
					resultLinklist.add(number);
				} else {
					findData(subStrTwo, number++);
				}
			}
		}
	}

	public static void main(String[] args) {
		try {
			int count = 2;
			Scanner scan = new Scanner(System.in);
			String value = scan.nextLine();
			if (value == null || value.length() == 0) {
				System.out.println("input error");
				return;
			}
			findData(value, count);
			int result = 0;
			if (1 < resultLinklist.size()) {
				result = -1;
			} else if (1 == resultLinklist.size() ) {
				result = resultLinklist.get(0);
			}
			System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("input error");
		}
	}
}

代码运行结果

AXdddF
2

版权说明

试题来源:华为 OD 联盟整理收集

题解:解题思路代码 为原创内容,该部分版权由 OD 联盟共同拥有,并授权组内成员发布。

目标:👉 助你解开所有JAVA华为OD机试题


🔥系列专栏

  • 华为OD机试(JAVA)真题目录汇总
  • 华为OD机试(Python)真题目录汇总
  • 华为OD机试(C++)真题目录汇总
  • 华为OD机试(JavaScript)真题目录汇总
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【强烈推荐收藏】坚持3个月爆肝华为机试108题C++全解(适合新手入门,就业必刷套题)
华为OD机试 - 数列还原(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
06 字符串 子串
LeetCode 76. 最小覆盖子串
mysql判断一个字符串是否包含某子串 【转】
学习爬虫的第49天,正则表达式被我踩在脚下
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服