• ARTS打卡计划第四周-ALGORITHM


    866. 回文素数

    求出大于或等于 N 的最小回文素数。

    回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数

    例如,2,3,5,7,11 以及 13 是素数。

    回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。

    例如,12321 是回文数。

    package com711;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class Solution866 {
    	public int primePalindrome(int N) {
    		List<Integer> list = getPalindrome(N);
    		Collections.sort(list);
    		return list.get(0);
    
    	}
    
    	public List<Integer> getPalindrome(int N) {
    		List<Integer> list = new ArrayList<Integer>();
    		// 10以内的特例
    		for (int i = N; i < 10; i++) {
    			if (isPrime(i)) {
    				list.add(i);
    				return list;
    			}
    
    		}
    		int start = getMinStart(N);
    		// 双数的判断
    		for (int i = (int) Math.pow(10, start); i < 10000; i++) {
    			int num = Integer.parseInt(i + "" + reverse(i));
    			if (num >= N && isPrime(num) && num < 200000000) {
    				list.add(num);
    				break;
    			}
    		}
    
    		for (int i = (int) Math.pow(10, start); i < 10000; i++) {
    			for (int j = 0; j <= 9; j++) {
    				int num1 = Integer.parseInt(i + "" + j + reverse(i));
    				if (num1 >= N && isPrime(num1) && num1 < 200000000) {					
    					list.add(num1);
    					return list;
    				}
    			}
    
    		}
    
    		return list;
    	}
    
    	public boolean isPrime(int n) {
    		if (n == 1) {
    			return false;
    		}
    		for (int i = 2; i <= Math.sqrt(n); i++) {
    			if (n % i == 0) {
    				return false;
    			}
    		}
    		return true;
    	}
    
    	public String reverse(int n) {
    		char[] chars = (n + "").toCharArray();
    		int len = chars.length;
    		for (int i = 0; i < len / 2; i++) {
    			char temp = chars[i];
    			chars[i] = chars[len - i - 1];
    			chars[len - i - 1] = temp;
    		}
    		return new String(chars);
    	}
    
    	public boolean isHuiWen(int n) {
    		char[] chars = (n + "").toCharArray();
    		int len = chars.length;
    		for (int i = 0; i < len; i++) {
    			if (chars[i] != chars[len - i - 1]) {
    				return false;
    			}
    		}
    		return true;
    
    	}
    
    	public int getMinStart(int n) {
    		String str = n + "";
    		str = str.substring(0, str.length() / 2);
    
    		return str.length() / 2;
    	}
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Solution866 s = new Solution866();
    
    		long start = System.currentTimeMillis();
    		System.out.println(s.primePalindrome(85709140));
    		long end = System.currentTimeMillis();
    		System.out.println(end - start);
    	}
    
    }
    

      本题最大的困扰是如果直接不找规律遍历的话,你肯定会超时。因此要用最快的方法,找到最近的回文数,去判断。

  • 相关阅读:
    通过strace 监控 fdatasync
    RAID 2.0
    AHCI vs NVMe
    NVMe 图解
    详解linux运维工程师入门级必备技能
    条带深度 队列深度 NCQ IOPS
    NVMe 与 AHCI
    IO负载高的来源定位 IO系列
    磁盘性能指标--IOPS 理论
    java程序员从笨鸟到菜鸟系列
  • 原文地址:https://www.cnblogs.com/dongqiSilent/p/10847886.html
Copyright © 2020-2023  润新知