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。 来自百度。的更多相关文章

  1. 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。

    题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后. 要求:空间复杂度是O(1),且 ...

  2. 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。

    在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"LX"替换一个"XL ...

  3. 三种字符编码:ASCII、Unicode和UTF-8

    原文:三种字符编码:ASCII.Unicode和UTF-8 什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字 ...

  4. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  5. 【Golang 接口自动化07】struct转map的三种方式

    背景 我们在前面介绍过怎么使用net/http发送json或者map数据,那么它能不能直接发送结构体数据呢?我们今天一起来学习结构体struct转map的三种方法,为后续做铺垫. struct转map ...

  6. python学习Day8 三种字符类型、文件操作

    复习 类型转换 1.数字类型:int() | bool() | float() 2.str与int:int('10') | int('-10') | int('0') | float('-.5') | ...

  7. 头像截图上传三种方式之一(一个简单易用的flash插件)(asp.net版本)

    flash中有版权声明,不适合商业开发.这是官网地址:http://www.hdfu.net/ 本文参考了http://blog.csdn.net/yafei450225664/article/det ...

  8. 怎么用snapman一个人在三天内开发出一个复杂的软件开发项目管理系统

    snapman是一个简单而强大的团队协作软件,在上面的信息可以是数据.可以是规则.也可以是自动化代码:最重要的它是一个可以开发的协作平台,所有信息都可以作用到所有人或机器上,大大减少了工作的复杂度.软 ...

  9. 三、临时弹出一个QQ对话窗口

    第一种:需要添加好友才可以访问 <a href="http://wpa.qq.com/msgrd?v=3&uin=317985559&site=qq&menu= ...

  10. 常见三种字符编码的区别:ASCII、Unicode、UTF-8

    什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255( ...

随机推荐

  1. mysql基础_事务

    定义 一个事务其实就是一个完整的业务逻辑,是一个最小的工作单元,不可再分,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败. 例如:王五向赵六的账户上转 ...

  2. Java常见的线程池的创建及使用

    文章目录 线程池是什么? 线程池的主要参数 线程池的拒绝策略 创建线程池的方式 关闭线程池 大家好,我是Leo!今天准备和大家一起分享的知识是线程池,刚好今天在看八股文,就顺带写一下并把一些实践的例子 ...

  3. CentOS 8 部署 ELK 8.7真的是方便呀

    之前装过一次 ELK 7.7,相比之下装 8.7可方便太多了~ CentOS版本 CentOS-8.5.2111-x86_64-dvd1 JAVA ELK会自己使用内置版本的JDK ElasticSe ...

  4. 【Redis】常用命令介绍

    一.Redis常用基本命令 官方文档:https://redis.io/commands/ 参考文档:http://redisdoc.com/ #可以使用help命令查看各redis命令用法[root ...

  5. vue+vant项目中 rem适配配置

    vant rem适配,需要安装两个插件 postcss-pxtorem 是一款 postcss 插件,用于将单位转化为 rem lib-flexible 用于设置 rem 基准值 postcss-px ...

  6. 2023-04-06:拥抱Golang,优化FFmpeg音频编码器,探究encode_audio.c的内部结构。

    2023-04-06:拥抱Golang,优化FFmpeg音频编码器,探究encode_audio.c的内部结构. 答案2023-04-06: 见moonfdd/ffmpeg-go库. 这段代码是一个示 ...

  7. vue全家桶进阶之路8:Axios的安装与HTTP请求实战

    Axios是一个基于Promise的HTTP客户端,用于在浏览器和Node.js中发送HTTP请求.它可以使用在Vue中发送请求以及与后端API进行交互. 在Vue中使用Axios可以通过以下步骤: ...

  8. aggregate和annotate⽅法

    现在来看下⼏组实际使⽤案例.使⽤前别忘了import Avg, Max, Min或者Sum⽅法哦from django.db.models import Avg, Max, Min计算学⽣平均年龄, ...

  9. get()、get_or_create()、first()、last()、latest()、earliest()、in_bulk()

    get() 查询. get_or_create() 不存在时更新.存在时查询并返回. first() 获取第一笔. last() 获取最后一笔. 使用latest和earliest时需要在元数据(me ...

  10. PictureBox保存图片照片到数据库

    Private Sub PAPHOTO_SAVE() Try If TxtPictureURL.Text.ToString <> "" Then Dim SQL_Str ...