2023-07-31:用r、e、d三种字符,拼出一个回文子串数量等于x的字符串。 1 <= x <= 10^5。 来自百度。
2023-07-31:用r、e、d三种字符,拼出一个回文子串数量等于x的字符串。
1 <= x <= 10^5。
来自百度。
答案2023-07-31:
大体步骤如下:
1.初始化一个字符串builder,用于构建结果字符串。
2.初始化一个字符变量cur,初始值为'r',用于轮流使用字符'r'、'e'和'd'构建回文串。
3.进入循环,直到输入的整数x变为0。
4.在循环中,使用near函数找到最接近x且满足条件的数值number。
near函数采用二分法搜索,从1开始逐渐增加m的值,直到找到满足条件的m值。满足条件是通过
ok函数判断,即判断n乘以n+1再除以2是否小于等于x。将满足条件的m值赋给ans,并继续搜索更大的m值。
5.对于当前找到的number,使用循环将字符cur添加到字符串builder中,重复number次。
6.计算处理完当前的number后,需要减去的值,即number乘以(number+1)再除以2,记为delta。
7.将delta从x中减去。
8.根据当前的cur字符,顺序更新cur为下一个字符。
如果cur是'r',则更新为'e'。
如果cur是'e',则更新为'd'。
如果cur是'd',则更新为'r'。注意,这是一个循环的过程。
9.返回构建好的字符串builder。
总时间复杂度为O(x * log(x)),总空间复杂度为O(1),其中x是输入的值。
go完整代码如下:
package main
import (
"fmt"
)
func palindromeX(x int) string {
builder := ""
cur := 'r'
for x > 0 {
number := near(x)
for i := 0; i < number; i++ {
builder += string(cur)
}
x -= number * (number + 1) / 2
if cur == 'r' {
cur = 'e'
} else if cur == 'e' {
cur = 'd'
} else {
cur = 'r'
}
}
return builder
}
func near(x int) int {
l := 1
r := x
m, ans := 0, 0
for l <= r {
m = (l + r) / 2
if ok(m, x) {
ans = m
l = m + 1
} else {
r = m - 1
}
}
return ans
}
func ok(n, x int) bool {
return int64(n*(n+1)/2) <= int64(x)
}
func main() {
x := 13
fmt.Println(palindromeX(x))
}

rust完整代码如下:
fn palindrome_x(x: i32) -> String {
let mut builder = String::new();
let mut cur = 'r';
let mut x = x;
while x > 0 {
let number = near(x);
for _ in 0..number {
builder.push(cur);
}
x -= number * (number + 1) / 2;
cur = match cur {
'r' => 'e',
'e' => 'd',
_ => 'r',
};
}
builder
}
fn near(x: i32) -> i32 {
let mut l = 1;
let mut r = x;
let mut ans = 0;
while l <= r {
let m = (l + r) / 2;
if ok(m, x) {
ans = m;
l = m + 1;
} else {
r = m - 1;
}
}
ans
}
fn ok(n: i32, x: i32) -> bool {
(n * (n + 1) / 2) <= x
}
fn main() {
let x = 13;
println!("{}", palindrome_x(x));
}

c++完整代码如下:
#include <iostream>
#include <string>
int near(int x);
std::string palindromeX(int x) {
std::string result;
char cur = 'r';
while (x > 0) {
int number = near(x);
for (int i = 0; i < number; i++) {
result += cur;
}
x -= number * (number + 1) / 2;
cur = (cur == 'r') ? 'e' : (cur == 'e') ? 'd' : 'r';
}
return result;
}
bool ok(int n, int x);
int near(int x) {
int l = 1;
int r = x;
int m, ans = 0;
while (l <= r) {
m = (l + r) / 2;
if (ok(m, x)) {
ans = m;
l = m + 1;
}
else {
r = m - 1;
}
}
return ans;
}
bool ok(int n, int x) {
return ((long long)n * (n + 1) / 2) <= x;
}
int main() {
int x = 13;
std::cout << palindromeX(x) << std::endl;
return 0;
}

2023-07-31:用r、e、d三种字符,拼出一个回文子串数量等于x的字符串。 1 <= x <= 10^5。 来自百度。的更多相关文章
- 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。
题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后. 要求:空间复杂度是O(1),且 ...
- 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。
在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"LX"替换一个"XL ...
- 三种字符编码:ASCII、Unicode和UTF-8
原文:三种字符编码:ASCII.Unicode和UTF-8 什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字 ...
- Hibernate 系列 07 - Hibernate中Java对象的三种状态
引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...
- 【Golang 接口自动化07】struct转map的三种方式
背景 我们在前面介绍过怎么使用net/http发送json或者map数据,那么它能不能直接发送结构体数据呢?我们今天一起来学习结构体struct转map的三种方法,为后续做铺垫. struct转map ...
- python学习Day8 三种字符类型、文件操作
复习 类型转换 1.数字类型:int() | bool() | float() 2.str与int:int('10') | int('-10') | int('0') | float('-.5') | ...
- 头像截图上传三种方式之一(一个简单易用的flash插件)(asp.net版本)
flash中有版权声明,不适合商业开发.这是官网地址:http://www.hdfu.net/ 本文参考了http://blog.csdn.net/yafei450225664/article/det ...
- 怎么用snapman一个人在三天内开发出一个复杂的软件开发项目管理系统
snapman是一个简单而强大的团队协作软件,在上面的信息可以是数据.可以是规则.也可以是自动化代码:最重要的它是一个可以开发的协作平台,所有信息都可以作用到所有人或机器上,大大减少了工作的复杂度.软 ...
- 三、临时弹出一个QQ对话窗口
第一种:需要添加好友才可以访问 <a href="http://wpa.qq.com/msgrd?v=3&uin=317985559&site=qq&menu= ...
- 常见三种字符编码的区别:ASCII、Unicode、UTF-8
什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255( ...
随机推荐
- dp杂题选做
树的数量 题目其实挺简单的,难点在于状态的设计(其实也没多难). 令 \(f_i\) 表示 \(i\) 个点的 \(m\) 叉树的数量,发现无法转移.设 \(g_{i,j}\) 表示根节点所在子树内有 ...
- Istio数据面新模式:Ambient Mesh技术解析
摘要:Ambient Mesh以一种更符合大规模落地要求的形态出现,克服了大多数Sidecar模式的固有缺陷,让用户无需再感知网格相关组件,真正将网格下沉为基础设施. 本文分享自华为云社区<华为 ...
- 给你安利一款国产良心软件uTools
前言 大家好,我是xiezhr 最近由于换了新电脑,也是在各种折腾搭建开发环境,安装各种常用软件.今天呢给大家安利一款你可能没用过的国产良心软件uTools,这也是我刚刚拿到电脑后安装的第一款软件吧. ...
- SqliLabs 第六关 报错注入!!!
点开网址,首先看到一个页面,首先尝试闭合字符 id=1 报错 id=1' 报错 id=1"成功 然后开始爆字段?id=1" order by 3 --+ 发现有三个字段然后查询显示 ...
- [MAUI]在.NET MAUI中复刻苹果Cover Flow
@ 目录 原理 3D旋转 平行变换 创建3D变换控件 绘制封面图片 应用3D旋转 应用平行变换 绘制倒影 创建绑定属性 创建绑定数据 创建布局 计算位置 计算3D旋转 创建动效 项目地址 Cover ...
- drf——反序列化校验源码(了解)、断言、drf之请求和响应、视图之两个视图基类
1.模块与包 # 模块与包 模块:一个py文件 被别的py文件导入使用,这个py文件称之为模块,运行的这个py文件称之为脚本文件 包:一个文件夹下有__init__.py # 模块与包的导入问题 '' ...
- OCR -- 文本识别 -- 理论篇
文本识别的应用场景很多,有文档识别.路标识别.车牌识别.工业编号识别等等,根据实际场景可以把文本识别任务分为两个大类:规则文本识别和不规则文本识别. 规则文本识别:主要指印刷字体.扫描文本等,认为文本 ...
- Nucleic Acids Research上关于生物医学分析Galaxy平台在几个独立面上的最新发展。
该平台的官方主服务器拥有超过124000注册用户,每月新注册用户~2000。平均而言,......
本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...
- PHP sprintf函数 bug
sprintf() 定义和用法 format参数 可能的格式值: %% - 返回一个百分号 % %b - 二进制数 %c - ASCII 值对应的字符 %d - 包含正负号的十进制数(负数.0.正数) ...
- Java如何实现去重?这是在炫技吗?
大家好,我3y啊.由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧.austin支持两种去重的类型:N分钟相同内容达到N次去重和一天内N次相同渠道频次去重. Java开源 ...