华为od机试 C++ 【切割字符串】

题目

给定一个由小写字母组成的字符串。请找出两个位置,将字符串分为三部分。这三部分的总和应该是相同的,其中每部分的总和是其字符的ASCII码值的总和。注意,这两个位置的字符不包括在这三部分内。

如果你找到了这两个位置,请输出它们的位置。如果没有找到,请输出0,0。

例子:

输入: acdbbbca
输出: 2,5
这是因为当我们在位置2和5进行分割,我们得到三个部分:ac,bb,ca。它们的ASCII码值的总和都是相同的。

输入: abcabc
输出: 0,0
在这个例子中,我们找不到这样的两个位置。

思路

我们需要找到两个位置,将字符串分成三部分,并且这三部分的ASCII码值总和相同。比如:在字符串 “acdbbbca” 中,可以在第2和第5个位置切割字符串,得到 “ac”、“bb” 和 “ca” 三个子串。这三个子串的ASCII码值总和都是195。
通过get_prefix_sum 可以算出给定字符串每个前缀的ASCII码值总和,得到一个前缀和数组。前缀和数组的第i个元素存储的是字符串前i个字符的ASCII码值的总和。有了前缀和数组之后,就能找出任意子串的ASCII码值总和。determine_positions 可以将字符串分割成三个ASCII码值总和相等的子串的两个位置。

代码

#include
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codereasy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值