• 欢迎光临~

字符串分割(100分Q2)

开发技术 开发技术 2022-06-09 次浏览

将字符串分割成一些子串,使每个子串的ASClI码值的和均为水仙花数(水仙花数就是各位的立方之和等于本身的数)。
1、若分割不成功,则返回0

2、若分割成功且分割结果不唯一,则返回-1

3、若分割成功且分割结果唯一,则返回分割后子串的数目

 

输入:abc

输出:0(说明:分割不成功)

 

输入:f3@d5a8

输出:-1(说明:分割成功且结果不唯一。结果1:f3和@d5a8,结果2:f3@d5和a8)

 

输入:AXdddF

输出:2(说明:分割成功且结果唯一:AX和dddF)


字符串最大长度为200

 1 package com.zsx.exam;
 2 
 3 import java.util.LinkedList;
 4 import java.util.Scanner;
 5 
 6 public class Main2 {
 7     public static void main(String[] args) {
 8 
 9         // 接收控制台数据
10         Scanner scanner = new Scanner(System.in);
11         String s = scanner.next();
12         scanner.close();
13 
14         // 存放分割子串的末端索引的链表
15         // 如f3@d5a8可分割为f3和@d5a8两个水仙花字符串,则链表中存放2和7
16         LinkedList<Integer> list = new LinkedList<>();
17 
18         // 当前分割子串的起始索引
19         int p = 0;
20 
21         // 当前状态(1:已成功分割过一次 0:还未分割成功过 -1:分割结果不唯一)
22         byte status = 0;
23 
24         // 记录第一次分割成功的子串数
25         int num = 0;
26 
27         // q为当前分割子串的末端索引
28         for (int q = 1; q <= s.length(); q++) {
29             if (q == s.length()) {
30                 
31                 // 如果分割成功,并且之前已成功分割过一次,状态置为-1并跳出循环
32                 if (isSXHStr(s, p, q) && status == 1) {
33                     status = -1;
34                     break;
35                 }
36                 
37                 // 如果分割成功,并且之前还未分割成功过,状态置为1,继续往下走尝试其他分割方法
38                 if (isSXHStr(s, p, q) && status == 0) {
39                     status = 1;
40                     num = list.size() + 1;
41                 }
42                 
43                 // 如果链表为空,说明已遍历完所有分割方法,跳出循环
44                 if (list.isEmpty()) {
45                     break;
46                 }
47 
48                 // 改变p和q以尝试其他分割方法
49                 q = list.getLast();
50                 list.removeLast();
51                 p = list.isEmpty() ? 0 : list.getLast();
52             }
53             else if (isSXHStr(s, p, q)) {
54                 list.add(q);
55                 p = q;
56             }
57         }
58         System.out.println(status == 1 ? num : status);
59     }
60 
61     // 判断分割子串是否为水仙花字符串
62     public static boolean isSXHStr(String s, int p, int q) {
63         int sum = 0;
64         for (int i = p; i < q; i++) {
65             char c = s.charAt(i);
66             sum += c;
67         }
68         return isSXHNum(sum);
69     }
70 
71     // 判断整数是否为水仙花数
72     public static boolean isSXHNum(int num) {
73         String s = String.valueOf(num);
74         int sum = 0;
75         for (int i = 0; i < s.length(); i++) {
76             Integer digit = Integer.valueOf(String.valueOf(s.charAt(i)));
77             sum += digit * digit * digit;
78         }
79         return sum == num;
80     }
81 }

 

程序员灯塔
转载请注明原文链接:字符串分割(100分Q2)
喜欢 (0)