【华为OD题库-095】字符串划分-Java

题目

给定一个小写字母组成的字符串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

题解

java 复制代码
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),查看当前专栏更新的所有题目。

说明

本专栏所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_31076523/article/details/134176793。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

相关推荐
Paxon Zhang几秒前
JavaEE 初阶变强宝典 **线程安全问题,线程状态,锁synchronized**
java·java-ee
阿拉金alakin2 分钟前
Java IO 核心类 File、InputStream/OutputStream 实战总结
java·开发语言
有梦想的小何6 分钟前
Cursor AI 编程实战(篇二):Rules、速查与 Adapter/App 全文
java·大数据·elasticsearch·搜索引擎·ai·ai编程
噢,我明白了2 小时前
表单的完整 CRUD 练习【极简个人记账本】(含前端后端链接mySQL)
java·前端·数据库·mysql
通往曙光的路上2 小时前
mysql1
java
Tigshop开源商城7 小时前
『物流设置+SEO优化』Tigshop开源商城系统 JAVA v5.8.26 版本更新!
java·开源商城系统·tigshop
Tigshop开源商城9 小时前
『订单税率+收货地址校验国家字段』功能上新|跨境运营更高效,Tigshop开源商城系统 JAVA v5.8.23 版本更新
java·开源商城系统·tigshop
REDcker9 小时前
C++变量存储与ELF段布局详解 从const全局到rodata与nm_readelf验证实践
java·c++·面试
kobesdu10 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
neo_Ggx2310 小时前
Maven 版本管理详解:SNAPSHOT、Release 与 Nexus 仓库的区别和影响
java·maven