字符串分割(100分Q2)
作者:互联网
将字符串分割成一些子串,使每个子串的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 }
标签:子串,分割,Q2,Scanner,d5a8,成功,f3,字符串,100 来源: https://www.cnblogs.com/zhangshiyu/p/16361716.html