分治——Secret Cow Code S(洛谷 P3612),java中事务面试题

本文介绍了如何使用分治策略解决Java编程中的字符串旋转问题,通过实例演示了如何找到无限字符串中给定索引的字符。同时提及了提供一套Java学习资源,帮助初级工程师系统提升技能。
摘要由CSDN通过智能技术生成

分治

分治,即为分而治之,顾名思义,就是把一个问题分成若干个子问题,然后对每个子问题分别处理,最后再将每个子问题的结果合并起来。


那么这道题目该如何分治呢

首先,为了找到第 N 个字符,我们可以用一个 t 变量记录在什么时候字符串长度超过 N ,代码如下

while (t < n) t <<= 1; //位运算更快

通过题意可得,当第 N 个字符在长度为 tt 的字符串的后半段时,前半段字符串中的第 N−1−t/2 个字符肯定与第 N 个字符相同,因为第 N 个字符在前一次操作时就是有第 N−1−t/2 个字符转换过来的,所以我们可以由此写出以下代码

while (t != l) t >>= 1, n -= 1 + t;

但是上面这段代码离正确代码虽然接近,却又相差甚远

在原操作中,我们是将字符串的最后一个字符移到第一个后接到原串后的。倒推可得,在长度为 t 的字符串中,当 N 等于 t/2+1 时,即第 N 个字符为后半段字符串的第一个时,与之必定相同的字符位置应为 t/2 或 N−1,因此加入这个特判后的代码如下

while (t != l) {

t >>= 1;

if (t + 1 == n) n = t;

else n -= 1 + t;

}

使用三目运算符也可以简写成以下代码

while (t != l) t >>= 1, n = (t + 1 != n) ? n - 1 - t : t;

以上所有代码都是建立在第 N 个字符在长度为 tt 的字符串的后半段时,当第 N 个字符在长度为 t 的字符串的前半段时,我们就不需要做任何操作,直接将 t/2 就行了,代码如下

while (t != l) {

t >>= 1;

if (n <= t) continue;

if (t + 1 == n) n = t;

else n -= 1 + t;

}

题目描述


奶牛正在试验秘密代码,并设计了一种方法来创建一个无限长的字符串作为其代码的一部分使用。

给定一个字符串,让后面的字符旋转一次(每一次正确的旋转,最后一个字符都会成为新的第一个字符)。也就是说,给定一个初始字符串,之后的每一步都会增加当前字符串的长度。

给定初始字符串和索引,请帮助奶牛计算无限字符串中位置N的字符。

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-JVB8VuhG-1710917732482)]

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值