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.生成代码+测试代码

 /**
* 生成函数:
* firstBiggerPalindrome(String n)
* isLeftReverseBiggerRight(String left, String right)
* 后期使用for循环校验N in [0,1000000)时的情况函数:
* nextPalindromeUseFor(int num, boolean[] Palindrome)
* isPalindrome(int num)
*
* 在main函数内进行算法生成 与 for循环暴力生成的校验
* */ public class Solution {
static String firstBiggerPalindrome(String n) { // 生成大于整数N(字符串表示)的第一个回文整数
n = String.valueOf(Integer.parseInt(n)); // 避免前导符"0",如n="009"
if (n.matches("9+")) // 特殊情况直接处理
return String.valueOf(Integer.parseInt(n) + 2); int len = n.length();
if (len == 1) // 长度为1
return String.valueOf(Integer.parseInt(n) + 1);
StringBuilder left = new StringBuilder(); // 左边
StringBuilder right = new StringBuilder(); // 右边
StringBuilder res = new StringBuilder(); // 结果
if ((len & 0x1) == 1) { // 奇数位
left.append(n.substring(0, len >> 1));
right.append(n.substring((len >> 1) + 1));
if (isLeftReverseBiggerRight(left.toString(), right.toString())) { // 如果左边翻转数字大于右边,直接翻转
res.append(left);
res.append(n.charAt(len >> 1));
res.append(left.reverse().toString());
} else { // 否则,“左边+中间”数字加1,再翻转
left.append(n.charAt(len >> 1));
int num = Integer.parseInt(left.toString()) + 1;
left.setLength(0);
left.append(num); res.append(num);
res.append(left.deleteCharAt(left.length() - 1).reverse()
.toString());
}
} else { // 偶数为
left.append(n.substring(0, len >> 1));
right.append(n.substring(len >> 1));
if (!isLeftReverseBiggerRight(left.toString(), right.toString())) {
int num = Integer.parseInt(left.toString()) + 1;
left.setLength(0);
left.append(num);
}
res.append(left.toString());
res.append(left.reverse().toString());
}
return res.toString();
} static boolean isLeftReverseBiggerRight(String left, String right) { // 比较左边翻转后数字与右边数字的大小关系
StringBuilder sb = new StringBuilder(left);
if (sb.reverse().toString().compareTo(right) > 0)
return true;
return false;
} static String nextPalindromeUseFor(int num, boolean[] Palindrome) { // 求大于num的第一个回文数(最后的测试代码使用)
for (int i = num + 1; i < Palindrome.length; i++) {
if (Palindrome[i] == true)
return String.valueOf(i);
}
return null;
} static boolean isPalindrome(int num) { // 判断一个数字是不是回文数字(最后的测试代码使用)
String str = String.valueOf(num);
int i = 0;
int j = str.length() - 1;
while (i < j) {
if (str.charAt(i) != str.charAt(j))
return false;
i++;
j--;
}
return true;
} public static void main(String[] args) throws IOException {
int n = 1000000; // 只测试[0,1000000)以内的结果
boolean[] Palindrome = new boolean[n]; //默认为false
for (int i = 0; i < n; i++) {
if (isPalindrome(i))
Palindrome[i] = true; //如果是回文数字,标记为true。编译下一步校验,大于N的第一个回文数字
} for (int i = 0; i < n; i++) {
String val = firstBiggerPalindrome(String.valueOf(i)); //程序生成
if (Integer.parseInt(val) < n) { //如果在[0,1000000)内,进行校验
if (!val.equals(nextPalindromeUseFor(i, Palindrome)))
System.out.println("BAD\t" + i);
}
}
}
}

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

Java编程小细节:

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

 import java.io.*;

 public class Solution {
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
sb.append("liuliuliu");
System.out.println(sb.toString());
sb.reverse(); //不需要返回值,也能翻转,记住啊!!!
System.out.println(sb.toString());
}
}

[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. maven配置文件中modules的作用

    modules 从字面意思来说,module就是模块,而pom.xml中的modules也正是这个意思,用来管理同个项目中的各个模块:如果maven用的比较简单,或者说项目的模块在pom.xml没进行 ...

  2. IEnumerable<T>

    IEnumerable 饮水思源 <C#本质论> Overview 根据定义,.Net 的中集合,本质上是一个类,它最起码实现了IEnumeraable 或者非泛型的IEnumerable ...

  3. 注册Goole 账户 成功注册

    注册谷歌邮箱等Google帐号时提示:此电话号码无法用于进行验证怎么办? 相信很多网友在注册Google帐号的时候需要手机号码验证,比如在遇到过注册Google Gmail到最后一步“验证您的帐号” ...

  4. 【转】Mapped Statements collection does not contain value for解决

    最近一直在弄springMVC+mybatis的整合,因为接触到这个框架之后发现这个框架确实要比ssh好得多所以我自己也在配置这个框架.但是在配置的过程中我遇到了一些问题,这些问题当我配置完成之后访问 ...

  5. 微信支付回调取不到body体中的信息node.js

    因为支付回调返回的数据格式为XML数据格式,需要安装组件body-parser-xml 安装语法:   npm install body-parser-xml --save 在app.js 文件中引入 ...

  6. doc文件中的cer附件保存到本地

    在word文档中有一个cer附件,可以双击直接安装证书. 我想把它保存到本地文件系统中,直接选中复制下来的cer文件,使用时,系统提示是无效证书.怎么才能正确 保存到本地文件系统?方法如下: 1.双击 ...

  7. LPC43xx Asymmetric Dual Core : Cortex-M0 and Cortex-M4

  8. 使用Axure RP原型设计实践02,自定义部件以及熟悉与部件相关面板

    本篇体验在Axure中自定义部件,并熟悉Widget Interations and Notes面板,Widget Properties and Style面板,Widget Manager面板. 在 ...

  9. Time Zones And Daylight Savings Time

    This page describes code for working with Time Zones and Daylight Savings Time. Neither VBA nor VB6 ...

  10. 什么是K线?K线的详解!

    K线图这种图表源于日本德川幕府时代,被当时日本米市的商人用来记录米市的行情与价格波动,后因其细腻独到的标画方式而被引入到股市及期货市场.目前,这种图表分析法在我国乃至整个东南亚地区均尤为流行.由于绘制 ...