Java蓝桥杯回文数

本文探讨了如何通过编程找出所有符合条件的四位回文数。介绍了两种方法:一是直接比较数字的各位数,二是将数字转换为字符串进行比较。此外,还讲解了字符串与数字之间的转换、StringBuilder的使用及字符串对比的正确方式。

问题描述

1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。

输出格式

按从小到大的顺序输出满足条件的四位十进制数。

这个题,我最先想到的就是之前的题里学到的,求出每一位的数字,然后,判断。(好吧,这也是我最后采取的方式)

但我觉得,还是要遵循老路子,先从网上学习一些新方法。于是我看到了不少。

先放上我的代码:

public class huiwenNum {
public static void main(String args[]){
for (int i=1000;i<10000;i++){
int ge=i/1000;
int shi=i%1000/100;
int bai=i%100/10;
int qian=i%10;
int a=qian1000+bai100+shi*10+ge;
if (a==i){
System.out.println(i);
}
}
}
}

再看看其他的方法。就是转换成字符串进行判断。这就涉及到几个新技能。代码中介绍

public class huiwenNum {
public static void main(String args[]){
String a;
for (int i=1000;i<10000;i++){
a=String.valueOf(i); #字符串转数字 Integer.valueOf(“12”)

                                    #数字转字符串 String.valueOf(12)

StringBuilder b=new StringBuilder(a); #这里要把String转变为StringBuilder,不然不能用下一句的reverse
b.reverse();
String c=new String(b); #这里就是再把StringBuilder转换成String
if (a.equals©){ #字符串的对等对比要用equals,是用来判断数字的
System.out.println(i); #相同的字符串,如果用
,结果也是FALSE
}
}
}
}

第二个编程,学到好多新知识,新技能。

1.字符串与数字的转变 2.String是不能变换的 3.字符串对比要用equals,==只能用来对比数字

<think>好的,我现在需要回答用户关于“Java蓝桥杯前缀和”的问题。首先,我得确认用户的需求是什么。蓝桥杯是一个编程竞赛,所以用户可能是在准备比赛时遇到了前缀和相关的问题,想了解如何在Java中应用前缀和算法来解决这类题目。 首先,我应该回顾一下前缀和的基本概念。前缀和是一种常用的算法技巧,主要用于快速计算数组区间内的和。它的核心思想是预先计算出一个前缀和数组,其中每个元素表示原数组从第一个元素到当前位置的总和。这样,当需要查询某个区间的和时,可以通过两次减法操作快速得到结果,而不必每次都遍历区间,从而提高效率。 接下来,我需要考虑在蓝桥杯竞赛中,前缀和可能会出现的题型。通常这类题目会涉及到多次区间和的查询,或者作为其他更复杂算法的一部分,比如结合差分数组、二维前缀和等。例如,可能有一维数组的区间和问题,或者二维矩阵的子矩阵和问题,这时候二维前缀和就会派上用场。 然后,我应该考虑如何在Java中实现前缀和。对于一维数组,假设原数组是arr,前缀和数组preSum的长度通常比原数组长一位,preSum[0] = 0,preSum[i]表示前i个元素的和。这样,区间[i, j]的和可以通过preSum[j+1] - preSum[i]来计算。需要注意的是数组的索引处理,避免越界错误。 对于二维前缀和,构造preSum数组时,每个元素preSum[i][j]表示从(0,0)到(i-1,j-1)的子矩阵和。计算子矩阵(x1,y1)到(x2,y2)的和时,公式为preSum[x2+1][y2+1] - preSum[x1][y2+1] - preSum[x2+1][y1] + preSum[x1][y1]。这需要用户理解二维前缀和的构造和查询方法。 接下来,我应该举一个具体的例子,比如蓝桥杯中可能出现的一道题目,说明如何应用前缀和。例如,题目可能要求计算数组中多个区间的和,这时候使用前缀和可以将每次查询的时间复杂度从O(n)降到O(1),总体时间复杂度从O(m*n)降到O(n + m),其中m是查询次数。 此外,可能需要提醒用户注意边界条件,比如数组索引是否从0开始,或者题目中的输入数据范围,避免因为数据量过大而导致超时。例如,当数组长度很大时,使用暴力方法会超时,而前缀和能有效解决这个问题。 另外,可能还需要提到前缀和的变种应用,比如处理环形数组时的技巧,或者结合哈希表解决某些特定问题,比如寻找和为k的子数组个数。这可能帮助用户在遇到更复杂的问题时,能够灵活应用前缀和思想。 最后,总结一下前缀和在蓝桥杯中的重要性,强调其作为基础算法在优化时间和空间复杂度上的作用,并建议用户通过练习相关题目来加深理解,比如LeetCode或蓝桥杯历年真题中的相关题目。 在编写回答时,需要确保结构清晰,分步骤讲解前缀和的实现和应用,并给出具体的Java代码示例,帮助用户更好地理解和应用。同时,注意使用正确的LaTeX格式来展示数学公式,如区间和的计算公式用$$...$$包裹,行内公式用$...$。此外,要使用中文回答,语言要简洁明了,符合用户的需求。</think>### Java蓝桥杯前缀和详解 前缀和是算法竞赛中的常见优化技巧,尤其在处理**区间和查询**问题时效率极高。下面从基础到应用逐步讲解其原理及Java实现。 --- #### 一、前缀和核心思想 - **定义**:前缀和数组 `preSum` 中,`preSum[i]` 表示原数组前 `i` 项的和。 - **作用**:将区间和查询的时间复杂度从 $O(n)$ 降至 $O(1)$。 --- #### 二、一维前缀和实现 **步骤**: 1. **构造前缀和数组**: $$preSum[0] = 0$$ $$preSum[i] = preSum[i-1] + arr[i-1] \quad (i \geq 1)$$ 2. **查询区间和**:区间 `[L, R]` 的和为: $$sum = preSum[R+1] - preSum[L]$$ **Java代码示例**: ```java int[] arr = {1, 3, 5, 7, 9}; int n = arr.length; int[] preSum = new int[n + 1]; for (int i = 1; i <= n; i++) { preSum[i] = preSum[i - 1] + arr[i - 1]; } // 查询arr[1]到arr[3]的和(索引从0开始) int L = 1, R = 3; int sum = preSum[R + 1] - preSum[L]; // 结果:3+5+7=15 ``` --- #### 三、二维前缀和 适用于**子矩阵和查询**问题。 **构造公式**: $$ preSum[i][j] = preSum[i-1][j] + preSum[i][j-1] - preSum[i-1][j-1] + matrix[i-1][j-1] $$ **查询子矩阵和**:子矩阵左上角 $(x1,y1)$,右下角 $(x2,y2)$: $$ sum = preSum[x2+1][y2+1] - preSum[x1][y2+1] - preSum[x2+1][y1] + preSum[x1][y1] $$ --- #### 四、蓝桥杯典型例题 **题目**:给定数组和多个区间查询,求每个区间的和。 **暴力法**:每次遍历区间,时间复杂度 $O(m \cdot n)$,易超时。 **前缀和优化**:预处理 $O(n)$,查询 $O(1)$,总时间 $O(n + m)$。 --- #### 五、注意事项 1. **索引处理**:前缀和数组通常比原数组多一位,避免越界。 2. **数据范围**:注意数值溢出问题,可用`long`类型存储前缀和。 3. **扩展应用**:结合哈希表求子数组个数(如LeetCode 560题)。 --- #### 六、练习建议 1. 一维练习:LeetCode 303、724 2. 二维练习:蓝桥杯“子矩阵和”历年真题 3. 扩展场景:环形数组、带权重的前缀和 掌握前缀和能显著提升竞赛中的编码效率,建议通过实际题目加深理解!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值