1.题目

  如标题,求大于整数N(N>=0)的第一个回文数的字符串表示形式。

  这个题目也是当时笔试第一次见到,花了一个小时才做出了。慢慢总结还是挺简单的。

2.分析

  分析如下:

  (1)一位数N(9除外)。

    第一个大于N回文数等于N+1,如大于3的第一个回文数是4。

   

  (2)奇数位(一位数除外)

    需要看“左边反转数字”是否大于"右边数字"

     1)如果小于等于,则“左边+中间字母”组成的数字+1,再对称就可以。

     2)如果大于,则左边数字直接对称到右边就可以啦。

    

  (3)偶数位

    需要看“左边反转数字”是否大于"右边数字"

     1)如果小于等于,则“左边”组成的数字+1,再对称就可以。

     2)如果大于,则左边数字直接对称到右边就可以啦。

    

  (4)特殊情况(其实就一种)

    1)N=9,大于N的下一个回文数是11,即N+2

    2)奇数情况(位数!=1)。

      N1=99900,右边数字小于“左边,翻转数字”,直接对称,所以大于N1的第一个回文数是99999。(满足上面的讨论规则)

      N2=99999,右边数组大于等于“左边,翻转数字”,使用上面的讨论规则结果为1000 001 ,不正确。结果应该是N2+2

    3)偶数情况。

      N1=9900,右边数字小于“左边翻转数字”,直接对称,所以大于N1的第一个回文数是9999。(满足上面的讨论规则)

      N2=9999,右边数组大于等于“左边翻转数字”,使用上面的讨论规则结果为100 001 ,不正确。结果应该是N2+2

  所以,可以将特殊情况归结为一种,当整数N满足正则表达式"9+"时,大于N的第一个回文数是N+2。(9,99,999,9999,.....)

3.生成代码+测试代码

  1. /**
  2. * 生成函数:
  3. * firstBiggerPalindrome(String n)
  4. * isLeftReverseBiggerRight(String left, String right)
  5. * 后期使用for循环校验N in [0,1000000)时的情况函数:
  6. * nextPalindromeUseFor(int num, boolean[] Palindrome)
  7. * isPalindrome(int num)
  8. *
  9. * 在main函数内进行算法生成 与 for循环暴力生成的校验
  10. * */
  11.  
  12. public class Solution {
  13. static String firstBiggerPalindrome(String n) { // 生成大于整数N(字符串表示)的第一个回文整数
  14. n = String.valueOf(Integer.parseInt(n)); // 避免前导符"0",如n="009"
  15. if (n.matches("9+")) // 特殊情况直接处理
  16. return String.valueOf(Integer.parseInt(n) + 2);
  17.  
  18. int len = n.length();
  19. if (len == 1) // 长度为1
  20. return String.valueOf(Integer.parseInt(n) + 1);
  21. StringBuilder left = new StringBuilder(); // 左边
  22. StringBuilder right = new StringBuilder(); // 右边
  23. StringBuilder res = new StringBuilder(); // 结果
  24. if ((len & 0x1) == 1) { // 奇数位
  25. left.append(n.substring(0, len >> 1));
  26. right.append(n.substring((len >> 1) + 1));
  27. if (isLeftReverseBiggerRight(left.toString(), right.toString())) { // 如果左边翻转数字大于右边,直接翻转
  28. res.append(left);
  29. res.append(n.charAt(len >> 1));
  30. res.append(left.reverse().toString());
  31. } else { // 否则,“左边+中间”数字加1,再翻转
  32. left.append(n.charAt(len >> 1));
  33. int num = Integer.parseInt(left.toString()) + 1;
  34. left.setLength(0);
  35. left.append(num);
  36.  
  37. res.append(num);
  38. res.append(left.deleteCharAt(left.length() - 1).reverse()
  39. .toString());
  40. }
  41. } else { // 偶数为
  42. left.append(n.substring(0, len >> 1));
  43. right.append(n.substring(len >> 1));
  44. if (!isLeftReverseBiggerRight(left.toString(), right.toString())) {
  45. int num = Integer.parseInt(left.toString()) + 1;
  46. left.setLength(0);
  47. left.append(num);
  48. }
  49. res.append(left.toString());
  50. res.append(left.reverse().toString());
  51. }
  52. return res.toString();
  53. }
  54.  
  55. static boolean isLeftReverseBiggerRight(String left, String right) { // 比较左边翻转后数字与右边数字的大小关系
  56. StringBuilder sb = new StringBuilder(left);
  57. if (sb.reverse().toString().compareTo(right) > 0)
  58. return true;
  59. return false;
  60. }
  61.  
  62. static String nextPalindromeUseFor(int num, boolean[] Palindrome) { // 求大于num的第一个回文数(最后的测试代码使用)
  63. for (int i = num + 1; i < Palindrome.length; i++) {
  64. if (Palindrome[i] == true)
  65. return String.valueOf(i);
  66. }
  67. return null;
  68. }
  69.  
  70. static boolean isPalindrome(int num) { // 判断一个数字是不是回文数字(最后的测试代码使用)
  71. String str = String.valueOf(num);
  72. int i = 0;
  73. int j = str.length() - 1;
  74. while (i < j) {
  75. if (str.charAt(i) != str.charAt(j))
  76. return false;
  77. i++;
  78. j--;
  79. }
  80. return true;
  81. }
  82.  
  83. public static void main(String[] args) throws IOException {
  84. int n = 1000000; // 只测试[0,1000000)以内的结果
  85. boolean[] Palindrome = new boolean[n]; //默认为false
  86. for (int i = 0; i < n; i++) {
  87. if (isPalindrome(i))
  88. Palindrome[i] = true; //如果是回文数字,标记为true。编译下一步校验,大于N的第一个回文数字
  89. }
  90.  
  91. for (int i = 0; i < n; i++) {
  92. String val = firstBiggerPalindrome(String.valueOf(i)); //程序生成
  93. if (Integer.parseInt(val) < n) { //如果在[0,1000000)内,进行校验
  94. if (!val.equals(nextPalindromeUseFor(i, Palindrome)))
  95. System.out.println("BAD\t" + i);
  96. }
  97. }
  98. }
  99. }

通过代码中的验证程序,可以验证算法的正确性,呵呵,nice!!!

Java编程小细节:

  这个题目是字符串处理的,所以用了StringBuilder的reverse();注意一下

  1. import java.io.*;
  2.  
  3. public class Solution {
  4. public static void main(String[] args) throws IOException {
  5. StringBuilder sb = new StringBuilder();
  6. sb.append("liuliuliu");
  7. System.out.println(sb.toString());
  8. sb.reverse(); //不需要返回值,也能翻转,记住啊!!!
  9. System.out.println(sb.toString());
  10. }
  11. }

[2014亚马逊amazon] 在线笔试题 大于非负整数N的第一个回文数 Symmetric Number的更多相关文章

  1. 在亚马逊amazon的AWS上安装Node和MongoDB服务器

    在亚马逊amazon的AWS上安装Node和MongoDB服务器 在建立AWS上账号.创建EC2 ,用putty链接上之后,就可以用下面的方法开始安装. !!! 如果不是是自己建立的EC2, 而是由B ...

  2. 亚马逊AWS在线系列讲座——基于AWS云平台的高可用应用设计

    设计高可用的应用是架构师的一个重要目标,可是基于云计算平台设计高可用应用与基于传统平台的设计有很多不同.云计算在给架构师带来了很多新的设计挑战的时候,也给带来了很多新的设计理念和可用的服务.怎样在设计 ...

  3. 通过SecureCRT访问亚马逊Amazon EC2主机

    亚马逊推出了免费的云主机服务器 Amazon EC2,它是通过安全密钥来访问主机的. 问题是下载的密钥在SecureCRT 上无法直接使用,需要转换. 下面的方法可以在自己的linux主机上生成sec ...

  4. 亚马逊 amazon connect(呼叫中心)

    背景 公司为提高客服部门沟通效率对接电话呼叫中心,调研后选择了亚马逊的Amazon Connect服务,因为是国外业务没有选择用阿里云,怕有坑. Amazon Connect后台 需要在后台创建“联系 ...

  5. 2014阿里巴巴WEB前端实习生在线笔试题

    2014年3月31日晚,我怀着稍微忐忑的心情(第一次在线笔试^_^!!)进行了笔试.阿里巴巴的笔试题共同拥有10道,差点儿包括了Web前端开发的各个方面,有程序题.有叙述题.时间很紧张,仅仅完毕了大概 ...

  6. 2014亚马逊在线笔试题目及解决方案(MMChess问题)

    整体思路:关键是需要知道当前Steps数组中的全排列即可,而且需要不重复的全排列.即关键在于非递归的全排列实现即可~ 其实直接利用STL中的next_permutation算法的,这里我又自己实现了一 ...

  7. U盘版Windows 10已经在亚马逊Amazon開始接受预订啦

    Windows 10定于下周7月29日正式公布. Windows 10家庭版119美元.专业版199美元,这个价格包含 Windows 10 授权.

  8. 亚马逊与Twitter携手电子商务

    亚马逊(Amazon)与Twitter开展了合作,允许用户以Twitter消息的形式将喜欢的商品发送到购物篮中.这些高科技企业正在想办法把社交媒体和电子商务融为一体. 这一功能旨在将Twitter转变 ...

  9. 亚马逊AWS业务副总裁:如何在基础设施上降成本

    腾讯科技 林靖东 11月17日编译 亚马逊Amazon Web Services业务的副总裁.著名工程师詹姆斯汉密尔顿(James Hamilton)在AWS re:Invent大会上解释了公司是如何 ...

随机推荐

  1. 利用transform的bug使fixed相对于父级定位

    首先,大家都清楚,元素使用fixed之后,若不设置top与left则会相对于最近的使用定位的父元素,并位于父元素的原点位置设置top与left值时,则会相对于窗口定位.但无论如何,此时仍相对于窗口定位 ...

  2. InnoDB的锁机制浅析(五)—死锁场景(Insert死锁)

    可能的死锁场景 文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/插入意 ...

  3. python集合相关操作

    集合相关操作 集合是一个无序的,不重复的数据组合,它有着两个主要作用:去重以及关系测试. 去重指的是当把一个列表变成了集合,其中重复的内容就自动的被去掉了 关系测试指的是,测试两组数据之间的交集.差集 ...

  4. zookeeper 节点启动时的更新机制

    使用zk的应用节点和zk数据本身的同步,当系统启动时使用zk配置的信息和zk本身存储不一致, 此时应存在一个更新机制将应用配置数据和zk数据更新一致. 启动时更新拉取zk配置中心的更新本地数据,以zk ...

  5. BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)

    BZOJ 洛谷 \(Solution\) 很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数. 那么就用两倍的.如果\(i\)可以向\(j'\)连边,\(j\ ...

  6. 使用 IntraWeb (16) - 基本控件之 TIWList、TIWListbox、TIWComboBox、TIWOrderedListbox

    TIWList //列表; 它对应 Html 中的 OL.LI(某些选项下会用表格模拟); TIWListbox 和 TIWComboBox 则对应 Html 在的 Option TIWListbox ...

  7. PHP之PDO_MYSQL扩展安装步骤(转)

    看到CakePHP文档要求安装pdo_mysql扩展,于是就尝试安装了一下. 这里我的系统是CentOS 6.0.如果你的系统是其他版本的Linux/Unix,可以参考.如果你的系统是Windows的 ...

  8. POJ 2337 Catenyms (有向图欧拉路径,求字典序最小的解)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8756   Accepted: 2306 Descript ...

  9. PeekMessage和GetMessage函数的主要区别

    PeekMessage和GetMessage函数的主要区别 PeekMessage和GetMessage函数的主要区别有:1. GetMessage的主要功能是从消息队列中“取出”消息,消息被取出以后 ...

  10. GitHub 第一坑:换行符自动转换

    源起 一直想在 GitHub 上发布项目.参与项目,但 Git 这货比较难学啊.买了一本<Git 权威指南>,翻了几页,妈呀,那叫一个复杂,又是 Cygwin 又是命令行的,吓得我不敢学了 ...