给定一个小写字母组成的字符串S,请找出字符串中两个不同位置的字符作为分割点,使得字符串分成三个连续子串且子串权重相等,注意子串不包含分割点。
若能找到满足条件的两个分割点,请输出这两个分割点在字符串中的位置下标,若不能找到满足条件的分割点请返回"0,0"。子串权重计算方式为:子串所有字符的ASCII码数值之和。
输入描述
输入为一个字符串,字符串由a~z,26个小写字母组成,5< S.length < 200。
输出描述
输出为两个分割点在字符串中的位置下标,以逗号分隔
备注
只考虑唯一解,不存在一个输入多种输出解的情况
示例1:
输入
acdbbbca
输出
2,5
说明
以位置2和5作为分割点,将字符串分割为ac, bb,ca三个子串,每一个的子串权重都为196,输出为: 2,5
示例2:
输入∶
abcabc
输出
0,0
说明
找不到符合条件的分割点,输出为:0,0
先将输入转为nums数组,char转为int
初始状况,左边界i为1,右边界j为nums.length-2
左边的值为:left=nums[0],右边的值为right=nums[nums.length-1]
如果left<right,i继续右移,更新left值
如果left>right,j继续左移,更新right值
如果left==right,此时计算mid的值,mid=sum-left-right-nums[i]-nums[j];如果mid等于left=right,说明找到了这样的分界(i,j),如果mid小于right,此时不管是i右移还是j左移,只会使mid更小,直接break,如果mid大于right,将i右移或者j左移并更新对应的lefit/right
package hwod;
import java.util.Scanner;
public class DivideString {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int[] res = divided(str);
System.out.println(res[0] + "," + res[1]);
}
private static int[] divided(String str) {
int[] res = new int[]{0, 0};
int[] nums = new int[str.length()];
int sum = 0;
for (int i = 0; i < str.length(); i++) {
nums[i] = (int) str.charAt(i);
sum += nums[i];
}
int i = 1, j = nums.length - 2;
int left = nums[0], right = nums[nums.length - 1];
while (i < j) {
if (right < left) {
right += nums[j--];
} else if (right > left) {
left += nums[i++];
} else {
int mid = sum - left - right - nums[i] - nums[j];
if (mid == right) {
res = new int[]{i, j};
break;
} else if (mid < right) {
break;
} else {
left += nums[i++];
}
}
}
return res;
}
}
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。