目录

1 问题描述

2 解决方案

2.1 80分解法

2.2 网友标答解法

 


1 问题描述

问题描述
  123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
  输入一行,包含一个正整数n。
输出格式
  按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
  1<=n<=54。

2 解决方案

2.1 80分解法

初步看题,自己把题意给理解的太深奥了,对于输出的五位数和六位数,我以为00100也是符合要求的五位回文数,那么问题就来了,如何输出00100呢?其解法就只能使用字符串了,那么使用字符串后,问题又来了,如何对字符串进行从小到大排序呢?好吧,在这里又得把字符串转换成整数比较大小,计算排序位置,计算完后,再次输出字符串的顺序。说到这里,我个人感觉自己写的代码虽然复杂,但是计算的结果绝对比标答结果全,但是在蓝桥杯练习系统中判分却只有80分,郁闷,不过这次得吸取理解题意的教训了。

具体代码如下:

package com.liuzhen.systemExe;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set; public class Main{ public void getReverseN(int n){
Set<String> set = new HashSet<String>();
for(int i = 0;i < 10;i++){
int x1 = i;
for(int j = 0;j < 10;j++){
int x2 = j;
for(int k = 0;k < 10;k++){
int x3 = k;
if(2*(x1+x2)+x3 == n){
char[] temp = new char[5];
temp[0] = (char) (x1 + 48);
temp[1] = (char) (x2 + 48);
temp[2] = (char) (x3 + 48);
temp[3] = (char) (x2 + 48);
temp[4] = (char) (x1 + 48);
String tempS1 = String.valueOf(temp);
set.add(tempS1); temp[0] = (char) (x2 + 48);
temp[1] = (char) (x1 + 48);
temp[2] = (char) (x3 + 48);
temp[3] = (char) (x1 + 48);
temp[4] = (char) (x2 + 48);
String tempS2 = String.valueOf(temp);
set.add(tempS2);
}
if(2*(x1+x2+x3) == n){
char[] temp = new char[6];
temp[0] = (char) (x1 + 48);
temp[1] = (char) (x2 + 48);
temp[2] = (char) (x3 + 48);
temp[3] = (char) (x3 + 48);
temp[4] = (char) (x2 + 48);
temp[5] = (char) (x1 + 48);
String tempS1 = String.valueOf(temp);
set.add(tempS1); temp[0] = (char) (x1 + 48);
temp[1] = (char) (x3 + 48);
temp[2] = (char) (x2 + 48);
temp[3] = (char) (x2 + 48);
temp[4] = (char) (x3 + 48);
temp[5] = (char) (x1 + 48);
String tempS2 = String.valueOf(temp);
set.add(tempS2); temp[0] = (char) (x2 + 48);
temp[1] = (char) (x1 + 48);
temp[2] = (char) (x3 + 48);
temp[3] = (char) (x3 + 48);
temp[4] = (char) (x1 + 48);
temp[5] = (char) (x2 + 48);
String tempS3 = String.valueOf(temp);
set.add(tempS3); temp[0] = (char) (x2 + 48);
temp[1] = (char) (x3 + 48);
temp[2] = (char) (x1 + 48);
temp[3] = (char) (x1 + 48);
temp[4] = (char) (x3 + 48);
temp[5] = (char) (x2 + 48);
String tempS4 = String.valueOf(temp);
set.add(tempS4); temp[0] = (char) (x3 + 48);
temp[1] = (char) (x2 + 48);
temp[2] = (char) (x1 + 48);
temp[3] = (char) (x1 + 48);
temp[4] = (char) (x2 + 48);
temp[5] = (char) (x3 + 48);
String tempS5 = String.valueOf(temp);
set.add(tempS5); temp[0] = (char) (x3 + 48);
temp[1] = (char) (x1 + 48);
temp[2] = (char) (x2 + 48);
temp[3] = (char) (x2 + 48);
temp[4] = (char) (x1 + 48);
temp[5] = (char) (x3 + 48);
String tempS6 = String.valueOf(temp);
set.add(tempS6);
}
}
}
}
int len = set.size();
String[] result = new String[len];
int i = 0;
for(String tem : set)
result[i++] = tem;
int[] rI = getSort(result);
for(i = 0;i < len;i++){
int k = getMinI(rI);
System.out.println(result[k]);
rI[k] = len;
}
} public int[] getSort(String[] A){
int len = A.length;
int[] result = new int[len];
int[] tempResult = new int[len];
for(int i = 0;i < len;i++){
tempResult[i] = Integer.parseInt(A[i]);
}
for(int i = 0;i < len;i++){
int count = 0;
for(int j = 0;j < len;j++){
if(tempResult[i] > tempResult[j])
count++;
}
result[i] = count;
} return result;
} public int getMinI(int[] A){
int result = 0;
for(int i = 0;i < A.length;i++){
if(A[result] > A[i])
result = i;
}
return result;
} public static void main(String[] args){
//long t1 = System.currentTimeMillis();
Main test = new Main();
Scanner in = new Scanner(System.in);
System.out.println("请输入一个10进制整数:");
int n = in.nextInt();
test.getReverseN(n);
//long t2 = System.currentTimeMillis();
//System.out.println("耗时:"+(t2-t1)+"毫秒"); }
}

运行结果:

请输入一个10进制整数:
1
00100 请输入一个10进制整数:
2
00200
01010
001100
10001
010010
100001 请输入一个10进制整数:
52
899998
989989
998899

2.2 网友标答解法

具体代码如下:

package com.liuzhen.array_2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner; public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入数字n:");
int n=input.nextInt();
ArrayList<Integer> rs= new ArrayList<Integer>(); for(int i=1; i<10; i++)
for(int j=0; j<10; j++)
for(int k=0; k<10; k++){
if(2*i+2*j+k==n)
rs.add(i*10000 + j*1000 + k*100+ j*10 + i);
if(2*i+2*j+2*k==n)
rs.add(i*100000 + j*10000+ k*1000 + k*100+ j*10 + i);
}
Collections.sort(rs);
for(int i=0; i< rs.size(); i++)
System.out.println(rs.get(i));
} }

运行结果:

请输入数字n:
1 请输入数字n:
2
10001
100001 请输入数字n:
52
899998
989989
998899

算法笔记_038:特殊回文数(Java)的更多相关文章

  1. 【leetcode算法-简单】9. 回文数

    [题目描述] 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121输出: true示例 2: 输入: -121输出: false解释: ...

  2. 算法笔记_223:打印回型嵌套(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 *********** * * * ******* * * * * * * * *** * * * * * * * * * * *** * * * ...

  3. 算法笔记_190:历届试题 幸运数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的“筛法”生成 . 首先从1开始写出自然数1,2,3,4,5,6,.... 1 就是第 ...

  4. Java判断回文数算法简单实现

    好久没写java的代码了, 今天闲来无事写段java的代码,算是为新的一年磨磨刀,开个头,算法是Java判断回文数算法简单实现,基本思想是利用字符串对应位置比较,如果所有可能位置都满足要求,则输入的是 ...

  5. Java实现 蓝桥杯VIP 算法训练 回文数

    import java.util.Scanner; public class 回文数 { static int time = 0; public static int change(String st ...

  6. leetcode-判断回文数,非字符串算法(java实现)

    link: https://leetcode-cn.com/problems/palindrome-number/description/ 问题: 判断一个整数是否是回文数.回文数是指正序(从左向右) ...

  7. Java算法练习——回文数

    题目链接 题目描述 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1 输入: 121 输出: true 示例 2 输入: -121 输出: false ...

  8. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  9. PAT(B) 1079 延迟的回文数(Java)

    题目链接:1079 延迟的回文数 (20 point(s)) 题目描述 给定一个 k+1 位的正整数 N,写成 a​k​​⋯a​1​​a​0​​ 的形式,其中对所有 i 有 0≤a​i​​<10 ...

随机推荐

  1. eclipse 的alt shift a,r 这个快捷键怎么操作 怎么按 eclipse 快捷键 逗号 什么意思

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha eclipse 的alt shift a,r 这个快捷键怎么操作 怎么按 eclipse ...

  2. 苹果无sim卡激活

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 苹果无sim卡激活  这是不行的... 必须有SIM 卡. 有可能卡贴坏了,更换卡贴.

  3. BZOJ1038 瞭望塔

    学习了半平交面. 我这里写的是训练指南中的双端队列,每次判断是否删去更优然后更新. 看hzwer中有一处不太明白就是为何要将两段加入队列 后来对拍出错才知道是因为精度,当两线重合时他们叉积返回值是一个 ...

  4. 51nod1218 最长递增子序列 V2

    看见标签推荐顺便就做了吧 记$f[i], g[i]$为$i$的含$i$的前缀最长递增子序列和后缀递增子序列 只要满足$f[i] + g[i] == LIS + 1$,那么$i$就是可能的 对于$i$而 ...

  5. [BZOJ4009][HNOI2015]接水果(整体二分)

    [HNOI2015]接水果 时间限制:60s      空间限制:512MB 题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The b ...

  6. pom通用依赖

    <dependencies><!--common--><dependency><groupId>com.google.guava</groupId ...

  7. 微信公众平台—— 获取微信服务器IP地址

    微信公众平台—— 获取微信服务器IP地址 const ServerIpUrl = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?&acces ...

  8. android开发:退出程序(对话框、两次返回键退出)

    private void exitDialog() { AlertDialog.Builder aa=new AlertDialog.Builder(this); aa.setTitle(" ...

  9. springboot-application.properties可配置属性总结 (datasource 和 JPA)

    ########################################## ###datasource ########################################## ...

  10. pytest文档2-用例运行规则

    用例设计原则 文件名以test_*.py文件和*_test.py 以test_开头的函数 以Test开头的类 以test_开头的方法 所有的包pakege必须要有__init__.py文件 help帮 ...