分割字符串(每个子串的ASCII码值的和均为水仙花数)

给定非空字符串在s,将该字符串分割成一些子串,使每个子串的ASCII码值的和均为水仙花数。
1、若分割不成功则返回 0
2、若分割成功且分割结果不唯一则返回-1
3、若分割成功且分割结果唯一,则返回分割后的子串数目
备注:“水仙花数”是指一个三位数,每位上数字的立方和等于该数字本身,如 371是“水仙花数”,因为: 371=33+73+1^3

package com.OD.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class test3 {
    /**
     * 给定非空字符串在s,将该字符串分割成一些子串,使每个子串的ASCII码值的和均为水仙花数。
     * 1、若分割不成功则返回 0
     * 2、若分割成功且分割结果不唯一则返回-1
     * 3、若分割成功且分割结果唯一,则返回分割后的子串数目
     * 备注:“水仙花数”是指一个三位数,每位上数字的立方和等于该数字本身,如 371是“水仙花数”,因为:371=3^3+7^3+1^3。
     * @param args
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        // 超过长度200,返回分割不成功
        if (line.length() > 200) {
            System.out.println(0);
        }

        StringBuilder sb = new StringBuilder();
        ArrayList<String> strings = new ArrayList<>();
        char[] chars = line.toCharArray();
        System.out.println("chars:"+ Arrays.toString(chars));
        digui(chars, sb, strings, 0);

        // 分割成功且分割结果不唯一则返回-1
        if (strings.size() > 1) {
            System.out.println(strings);
            System.out.println(-1);
        }
        // 分割结果唯一打印分割的子串个数
        if (strings.size() == 1) {
            System.out.println(strings);
            System.out.println(strings.get(0).split(" ").length);
        }
        // 分割不成功则返回 0
        if (strings.size() == 0) {
            System.out.println(0);
        }
    }

    public static void digui(char[] chars, StringBuilder sb, ArrayList<String> strings, int startIndex) {
        int num = 0;
        StringBuilder sb_temp = new StringBuilder();
        for (int i = startIndex; i < chars.length; i++) {
            char aChar = chars[i];
            num += aChar;
            sb_temp.append(aChar);

            if (!isNar(num)) {
                continue;
            }

            StringBuilder sb_copy = new StringBuilder(sb);
            sb_copy.append(sb_temp).append(" ");

            if (i == chars.length - 1) {
                strings.add(sb_copy.toString().trim());
                return;
            }

            digui(chars, sb_copy, strings, i + 1);
        }
    }

    // 判断是否是水仙花数
    public static boolean isNar(int num) {
        if (num < 100 || num > 999) return false;
        int bai = num / 100;
        int shi = (num % 100) / 10;
        int ge = (num % 100) % 10;
        // Math.pow(底数x,指数y)
        int v = (int) (Math.pow(bai, 3) + Math.pow(shi, 3) + Math.pow(ge, 3));
        return v == num;
    }
}

原链接:https://www.peiluming.com/article/63

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值