2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。

现在,给定两个正整数 L 和 R (以字符串形式表示),

返回包含在范围 [L, R] 中的超级回文数的数目。

输入:L = "4", R = "1000"。

输出:4。

答案2023-06-12:

该算法的基本思路是从较小的回文数开始,一步步扩大得到超级回文数,检查是否在规定区间内,直到扩大的回文数超过给定区间右端点或者已经统计到所有的超级回文数。

大体步骤如下:

1.定义函数 superpalindromesInRange,输入两个正整数的字符串表示 leftright,返回包含在范围 [L, R] 中的超级回文数的数目。此函数的返回值为整数类型 int

2.将输入的字符串形式的正整数 leftright 分别转换成整数类型的变量 lr

3.将变量 r 开根号并取整,得到变量 limit。用变量 cnt 记录超级回文数的个数,初值为0。

4.变量 seed 初值为1,用于产生超级回文数。若当前 seed 对应的超级回文数已大于 r 的平方根,则跳出循环;否则进行下一步。

5.将变量 seed 进行第一次扩大,即将 seed 转化为一个更大的回文数,保存在变量 enlarge 中。

6.如果 enlarge 的平方数是超级回文数,则将 cnt 加一。

7.将变量 seed 进行第二次扩大,即将 seed 转化为一个更大的回文数,保存在变量 enlarge 中。

8.如果 enlarge 的平方数是超级回文数,则将 cnt 加一。

9.将 seed 加1。

10.回到步骤4,循环直到 seed 对应的扩大回文数大于 r 的平方根。

11.返回 cnt 作为函数的结果。

时间复杂度为 $O(\sqrt R\log R\log\log R)$,其中 $R$ 表示 right 的值,因为超级回文数的范围不超过 $\sqrt R$,而对于每一个超级回文数,需要判断其是否在 [L, R] 范围内,这个判断需要 $O(\log R)$ 的时间;同时,为了判断一个数是否是回文数,需要将其最高位和最低位一一比较,即需要 $O(\log n)$ 的时间,最多需要比较 $O(\log n)$ 次,因此判断回文数的时间复杂度为 $O(\log^2n)$。因此,总时间复杂度为 $O(\sqrt R\log R\log^2 R)$。

空间复杂度为 $O(1)$,因为程序只使用了常数个变量。

go语言完整代码如下:

package main

import (
"fmt"
"math"
"strconv"
) func superpalindromesInRange(left string, right string) int {
l, _ := strconv.ParseInt(left, 10, 64)
r, _ := strconv.ParseInt(right, 10, 64)
limit := int64(math.Sqrt(float64(r)))
cnt := 0
seed := int64(1)
enlarge := int64(0)
for {
enlarge = enlarge2(seed)
if isValid(enlarge*enlarge, l, r) {
cnt++
}
enlarge = enlarge1(seed)
if isValid(enlarge*enlarge, l, r) {
cnt++
}
seed++
if enlarge >= limit {
break
}
}
return cnt
} func enlarge1(seed int64) int64 {
var ans int64 = seed
seed /= 10
for seed != 0 {
ans = ans*10 + seed%10
seed /= 10
}
return ans
} func enlarge2(seed int64) int64 {
var ans int64 = seed
for seed != 0 {
ans = ans*10 + seed%10
seed /= 10
}
return ans
} func isValid(ans int64, l int64, r int64) bool {
return isPalindrome(ans) && ans >= l && ans <= r
} func isPalindrome(n int64) bool {
var help int64 = 1
for n/help >= 10 {
help *= 10
}
for n != 0 {
if n/help != n%10 {
return false
}
n = (n % help) / 10
help /= 100
}
return true
} func main() {
result := superpalindromesInRange("4", "1000")
fmt.Println(result)
}

rust完整代码如下:

fn superpalindromes_in_range(left: String, right: String) -> i32 {
let l: u64 = left.parse().unwrap();
let r: u64 = right.parse().unwrap();
let limit = (r as f64).sqrt() as u64;
let mut cnt = 0;
let mut seed = 1;
let mut enlarge = 0;
loop {
enlarge = enlarge2(seed);
if is_valid(enlarge * enlarge, l, r) {
cnt += 1;
}
enlarge = enlarge1(seed);
if is_valid(enlarge * enlarge, l, r) {
cnt += 1;
}
seed += 1;
if enlarge >= limit {
break;
}
}
cnt
} fn enlarge1(seed: u64) -> u64 {
let mut ans = seed;
let mut tmp = seed / 10;
while tmp != 0 {
ans = ans * 10 + tmp % 10;
tmp /= 10;
}
ans
} fn enlarge2(seed: u64) -> u64 {
let mut ans = seed;
let mut tmp = seed;
while tmp != 0 {
ans = ans * 10 + tmp % 10;
tmp /= 10;
}
ans
} fn is_palindrome(n: u64) -> bool {
let mut help: u64 = 1;
let mut tmp = n;
while tmp / help >= 10 {
help *= 10;
}
while tmp != 0 {
if tmp / help != tmp % 10 {
return false;
}
tmp = (tmp % help) / 10;
help /= 100;
}
true
} fn is_valid(ans: u64, l: u64, r: u64) -> bool {
is_palindrome(ans) && ans >= l && ans <= r
} fn main() {
let result = superpalindromes_in_range(String::from("4"), String::from("1000"));
println!("{}", result);
}

c++完整代码如下:

#include <iostream>
#include <string>
#include <cmath> using namespace std; long long enlarge1(long long seed);
long long enlarge2(long long seed);
bool isPalindrome(long long n);
bool isValid(long long ans, long long l, long long r);
int superpalindromesInRange(string left, string right); int main() {
int result = superpalindromesInRange("4", "1000");
cout << result << endl;
return 0;
} long long enlarge1(long long seed) {
long long ans = seed;
seed /= 10;
while (seed != 0) {
ans = ans * 10 + seed % 10;
seed /= 10;
}
return ans;
} long long enlarge2(long long seed) {
long long ans = seed;
while (seed != 0) {
ans = ans * 10 + seed % 10;
seed /= 10;
}
return ans;
} bool isPalindrome(long long n) {
long long help = 1;
while (n / help >= 10) {
help *= 10;
}
while (n != 0) {
if (n / help != n % 10) {
return false;
}
n = (n % help) / 10;
help /= 100;
}
return true;
} bool isValid(long long ans, long long l, long long r) {
return isPalindrome(ans) && ans >= l && ans <= r;
} int superpalindromesInRange(string left, string right) {
long long l = stoll(left);
long long r = stoll(right);
long long limit = sqrt(r);
int cnt = 0;
long long seed = 1;
long long enlarge = 0;
do {
enlarge = enlarge2(seed);
if (isValid(enlarge * enlarge, l, r)) {
cnt++;
}
enlarge = enlarge1(seed);
if (isValid(enlarge * enlarge, l, r)) {
cnt++;
}
seed++;
} while (enlarge <= limit);
return cnt;
}

c语言完整代码如下:

#include <stdio.h>
#include <string.h>
#include <math.h> long long enlarge1(long long seed);
long long enlarge2(long long seed);
int isPalindrome(long long n);
int isValid(long long ans, long long l, long long r);
int superpalindromesInRange(char* left, char* right); int main() {
int result = superpalindromesInRange("4", "1000");
printf("%d\n", result);
return 0;
} long long enlarge1(long long seed) {
long long ans = seed;
seed /= 10;
while (seed != 0) {
ans = ans * 10 + seed % 10;
seed /= 10;
}
return ans;
} long long enlarge2(long long seed) {
long long ans = seed;
while (seed != 0) {
ans = ans * 10 + seed % 10;
seed /= 10;
}
return ans;
} int isPalindrome(long long n) {
long long help = 1;
while (n / help >= 10) {
help *= 10;
}
while (n != 0) {
if (n / help != n % 10) {
return 0;
}
n = (n % help) / 10;
help /= 100;
}
return 1;
} int isValid(long long ans, long long l, long long r) {
return isPalindrome(ans) && ans >= l && ans <= r;
} int superpalindromesInRange(char* left, char* right) {
long long l = atoll(left);
long long r = atoll(right);
long long limit = sqrt(r);
int cnt = 0;
long long seed = 1;
long long enlarge = 0;
do {
enlarge = enlarge2(seed);
if (isValid(enlarge * enlarge, l, r)) {
cnt++;
}
enlarge = enlarge1(seed);
if (isValid(enlarge * enlarge, l, r)) {
cnt++;
}
seed++;
} while (enlarge <= limit);
return cnt;
}

2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。 现在,给定两个正整数 L 和 R (以字符串形式表示), 返回包含在范围 [L, R] 中的更多相关文章

  1. 输入两个正整数m和n,求其最大公约数和最小公倍数

    public static void main(String[] args){  Scanner sc = new Scanner (System.in);  int a,b;  System.out ...

  2. 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。

    给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...

  3. 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组

    题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...

  4. C语言实验报告(五) 两个正整数的最大公约数

    编程实现求两个正整数的最大公约数,要求计算最大公约数用函数fun(int a,int b)实现. #include<stdio.h>void main(){  int n,a,b;  in ...

  5. SDUT 3503 有两个正整数,求N!的K进制的位数

    有两个正整数,求N!的K进制的位数 题目链接:action=showproblem&problemid=3503">http://sdutacm.org/sdutoj/prob ...

  6. 代码代码:输入两个正整数m和n,求其最大公约数和最小公倍数。15 20 5

    import java.util.Scanner; //输入两个正整数m和n,求其最大公约数和最小公倍数.15 20 5 public class Test { public static void ...

  7. 输入两个正整数num1、num2,计算并输出它们的和、差、积、整数商和余数

    课本例题 /*输入两个正整数num1.num2,计算并输出它们的和.差.积.整数商和余数.*/ #include<stdio.h> int main() { int num1, num2; ...

  8. 给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000), 另一个是目标字符串TS(长度<1000),请问能否通过删除SS中的字符(不改变顺序)将它变换成TS,如果可以输出“YES",不可以则输出“NO"。 输入说明:第一行为源字符串SS,第二行为目标字符串TS。

    import java.util.Scanner;/*    给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000),    另一个是目标字符串TS(长度<1 ...

  9. Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】

    源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...

  10. 2019-6-27-WPF-如何给定两个点画出一条波浪线

    title author date CreateTime categories WPF 如何给定两个点画出一条波浪线 lindexi 2019-6-27 10:17:6 +0800 2019-6-26 ...

随机推荐

  1. Thanos工作原理及组件简介

    Thanos 简介 Thanos 是一个「开源的,高可用的 Prometheus 系统,具有长期存储能力」.很多知名公司都在使用 Thanos,也是 CNCF 孵化项目的一部分. Thanos 的一个 ...

  2. Defi开发简介

    Defi开发简介 介绍 Defi是去中心化金融的缩写, 是一项旨在利用区块链技术和智能合约创建更加开放,可访问和透明的金融体系的运动. 这与传统金融形成鲜明对比,传统金融通常由少数大型银行和金融机构控 ...

  3. 数据挖掘系统聚类—R实现

    系统聚类法 聚类就是按照某个特定标准把一个数据集分割成不同的类或簇,最后的结果是希望同类之间的差异性尽可能小,不同类之间的差异性尽可能大.不同的类具有能够表达异于其他类的指标,这样针对不同的类,后续就 ...

  4. 在k8s上安装Harbor

    在k8s上安装Harbor 先前条件 <kubernetes(k8s) 存储动态挂载><在k8s(kubernetes)上安装 ingress V1.1.3> 参考我之前的文档 ...

  5. 部署lnmp环境,安装typecho博客

    安装nginx和PHP环境 root@cby:~# apt install nginx php7.4 php7.4-mysql php7.4-fpm 修改nginx配置文件 root@cby:~# v ...

  6. 有关使用druid配置多数据源多个实例数据源和配置一个实例多个库

    配置多数据源有以下几个说法. 1.多数据库类同时链接mysql,oracle,mongo等等 一般这样的配置这几个数据源不会存在一个实例(机器等)上.也属于多实例数据源. 类似如下图 有的是aliyu ...

  7. 3D开发工具HOOPS最新解析合集!助力实现web端高性能模型渲染!

    一.3D技术为创新提供强大助力(1)3D专家提供专属技术支持服务不管您想搭建桌面.WEB或者移动端APP应用,技术领先全球的HOOPS Platform组件都可以为您提供弹性的3D集成架构,同时,一批 ...

  8. MySQL(二)字符集、比较规则与规范

    1 字符集的相关操作 MySQL8.0之前的版本,默认字符集为latin1,8.0及之后默认为utfmb3.utfmb4,如果以前的版本忘记修改默认的密码,就会出现乱码的问题. 1.1 修改步骤 修改 ...

  9. OpenCv单模版多目标匹配

    OpenCv单模版多目标匹配 单模版匹配出现的问题 一. 关于单模版匹配,我一开始用的是光线较暗的图,结果根据模版匹配到的位置并不正确. 我后来想用阈值把图形的特征提取出来,在把模版的特征和原图的特征 ...

  10. Vue中使用Echarts 脱坑

    1. 数据问题,不像官方实例所提供的数据直接写在options对应的数据源里,开发中应当是后端接口请求过来的数据,一般来说,会将echarts图标抽成组件的形式,需要的数据源通过父组件传给子组件,但是 ...