3-7 最大数Java

/* [12,127,85,66,27,34,15,344,156,344,29,47,....]  
    这是某设备测量到的工程数据。
    因工程要求,需要找出最大的5个值。
    一般的想法是对它排序,输出前5个。但当数据较多时,这样做很浪费时间。
    因为对输出数据以外的数据进行排序并非工程要求,即便是要输出的5个数字,也并不要求按大小顺序,只要找到5个就可以。
    以下的代码采用了另外的思路。考虑如果手里已经抓着5个最大数,再来一个数据怎么办呢?
    让它和手里的数据比,如果比哪个大,就抢占它的座位,让那个被挤出来的再自己找位子,....*/
import java.util.*;
public class Main{
	public static void main(String[] args){
		List<Integer> lst = new Vector<Integer>();
		lst.addAll(Arrays.asList(12,127,85,66,27,34,15,344,156,344,29,47));		
		System.out.println(max5(lst));
	}
	public static List<Integer> max5(List<Integer> lst){
		if(lst.size()<=5) return lst;
		//从此滚动列表中移除指定位置处的项。如果选中了指定位置的项,并且该项是列表中惟一选中的项,则列表将被设置为无选择。 
		int a= lst.remove(0);  // 填空
		List<Integer> b = max5(lst);
		for(int i=0; i<b.size(); i++){
			int t = b.get(i);
			if(a>t){
				//将大的数放入排序队列中
				b.set(i,a);  // 填空
				a = t;  
			}
		}
		return b;
	}
}

 

### 特殊回文数的定义 特殊回文数是指既满足特定条件又具有回文结构的整数。对于此类数值,在编程中通常涉及两个主要操作:一是验证一个给定数字是否构成这样的特殊形式;二是基于一定规则生成符合条件的新实例。 ### 判定与生成逻辑 为了在 Java 中实现上述功能,可以采用如下策略: #### 方法一:直接构建法 此方式适用于已知范围内的查找任务。通过遍历指定区间内所有可能候选者并逐一检验其属性来完成目标。具体而言,先构造出一系列基础形态(即最简单的回文序列),再逐步扩展直至达到预期长度或特性匹配为止[^1]。 ```java public boolean isPalindrome(int num){ String strNum = Integer.toString(num); int left=0,right=strNum.length()-1; while (left<right){ if(strNum.charAt(left++)!=strNum.charAt(right--)){ return false; } } return true; } ``` #### 方法二:迭代调整方案 当面对更复杂的场景时,则可考虑运用动态规划的思想来进行求解。这里的关键在于维护一组状态变量用于记录当前最优解及其相关信息,并据此指导后续决策过程中的更新方向。例如,在寻找最小素数回文的过程中,每当发现一个新的合格选项后便立即停止进一步探索,从而有效减少不必要的计算开销[^3]。 ```java import java.math.BigInteger; public class SpecialPalindromeFinder { private static final BigInteger TWO = BigInteger.valueOf(2); public static BigInteger findSmallestPrimePalindrome(BigInteger n) { while (!isPrime(n) || !isPalindrome(n)) { n = nextPalindrome(n.add(TWO)); } return n; } private static boolean isPrime(BigInteger number) { return number.isProbablePrime(10); // 使用内置方法检测概率性素数 } private static boolean isPalindrome(BigInteger number) { String s = number.toString(); int length = s.length(); for (int i = 0; i < length / 2; ++i) { if (s.charAt(i) != s.charAt(length - 1 - i)) return false; } return true; } private static BigInteger nextPalindrome(BigInteger current) { char[] digits = current.toString().toCharArray(); int size = digits.length; // 找到第一个不相等的位置 int mid = size >> 1, oddSize = size & 1; for (int i = mid - 1 + oddSize; i >= 0 && digits[i] == digits[size - 1 - i]; --i); // 如果整个数字已经是最大值则增加一位 if (mid <= 0 || digits[mid - 1 + oddSize] > digits[mid]) { Arrays.fill(digits, &#39;9&#39;); digits = new char[digits.length + 1]; digits[0] = &#39;1&#39;; digits[digits.length - 1] = &#39;1&#39;; } else { // 否则只改变中间部分 for (; mid >= 0;) { if (++digits[mid] > &#39;9&#39;) { digits[mid++] = &#39;0&#39;; } else break; } for (int l = oddSize ? mid : mid - 1, r = size - 1 - ((size + 1) >> 1); l >= 0; --l, ++r) digits[r] = digits[l]; } return new BigInteger(new String(digits)); } } ``` 以上代码展示了如何利用辅助函数 `nextPalindrome` 来获取下一个更大的回文数,并结合质数检查实现了对特殊回文数的有效检索[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值