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

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 }
时间: 2025-01-02 16:48:42

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

大于非负整数N的第一个回文数 Symmetric Number

1.题目 如标题,求大于整数N(N>=0)的第一个回文数的字符串表示形式. 2.样例 1  --> 2 9  -->11 12345 -->12421 123456 -->124421 999 -->1001 3.分析 借用:http://www.cnblogs.com/xudong-bupt/p/4015226.html 4.代码 1 import java.util.Scanner; 2 3 4 public class SymmetricNumber { 5 6

48行代码解一道亚马逊的在线笔试题

这题是我从这里看到的一道亚马逊的在线笔试题,具体规则请前往该文章查看,下面贴出我的解题代码: 其中11,12,13,14分别代表J,Q,K,A; class CardCompare { private int[] cards = new int[] { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; public bool CompareCards(int[] cards1, int[] cards2) { return cardsScore(card

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

设计高可用的应用是架构师的一个重要目标,但是基于云计算平台设计高可用应用与基于传统平台的设计有许多不同.云计算在给架构师带来了许多新的设计挑战的时候,也给带来了许多新的设计理念和可用的服务.如何在设计应用的时候充分利用云平台的各种特点是基于云计算设计的一个重要条件.在这个在线讲座中,我们将以亚马逊AWS云平台为例,讨论如何设计一个高可用应用. 我们先会根据AWS服务是否天然高可用.高容错的特点把常见的AWS服务分类.比如AWS把下面服务设计成高可用和高容错的服务: ·     Amazon S3

亚马逊AWS在线系列讲座——如何在AWS云平台上构建千万级用户应用

用户选择云计算平台来构建应用的一个重要原因是云平台的高弹性和高扩展性.面向互联网的应用往往需要支撑大量用户的使用,但是构建一个高扩展性的.高可用的应用具有一一定的挑战,不过基于AWS云平台来构建应用可以相对简化这个事情.这个在线讲座将讨论如何如何充分利用云平台的特性和AWS的相关服务来构建一个可以支撑千万级用户的应用.通过讨论不同用户数量级别的应用需求和架构特点,然后结合不同的AWS的服务来满足用户访问,并最终逐渐把架构优化成为可以支持千万级用户的设计.这个演讲的目的是帮助对AWS服务有一定基础

亚马逊Amazon卖家账户被封了,海猫跨境告诉你如何申诉

突然有一天,你收到亚马逊Amazon的通知,说你的帐户已经被移除销售权.你肯定会火速登录后台,仔细阅读亚马逊发来的通知,看看是神马情况.看完后你会恍然大悟,OMG,摊上大事了,帐户被封了! 遇到这种情况,卖家可以先来包辣条冷静冷静.也只有冷静了,才能进一步拯救帐户. 一.帐户被封的主要原因 "帐户被封"即是"帐户冻结"的状态,并非帐户已死.一般情况下,亚马逊也不会闲着没事干来封你的帐号.一定有原因的.而被封的原因,一般有以下几种: 1.账号表现差 亚马逊给卖家设定的

亚马逊AWS在线系列讲座——第1讲:云计算和AWS入门

无论您是正在运行照片共享或是关键业务应用程序,您都需要快速获取灵活和低成本的IT资源. "云计算"是指通过互联网,按需交付IT资源并且按使用量付费的服务.无论您是一个创业公司需要加快增长但缺乏前期投入资金,还是大型企业在降低成本的同时,寻求IT创新,提高敏捷性和灵活性, AWS提供了一套完整的无需前期投入的Web服务,您只需点击几下,即可在数分钟之内获得需要的资源. 亚马逊AWS在线讲座将围绕AWS云平台的各种服务分不同的主题对AWS服务进行系统介绍.AWS在线讲座系列会由浅入深帮助刚

亚马逊amazon黑科技--提高关键词搜索排名上首页

不管是做淘宝,ebay还是做亚马逊,只要是电商平台,都躲不多一个问题:如何使自己的产品排到搜索页面的首页,或者最好是排到搜索结果的前三名?数据统计表明,amazon平台80%的订单都被前3名瓜分掉了.因此,今天经纬互联电商学院的讲师就和大家分享一下亚马逊的排名规则. 一.A9搜索原理 亚马逊Amazon使用的搜索引擎叫做A9算法,Algorithm是算法的意思,以A开头,正好是9个字母,所以叫做A9.所以,不存在A8,更不存在A10的说法.不管A9算法怎么升级更新,永远都叫做A9算法.A9算法最

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

亚马逊推出了免费的云主机服务器 Amazon EC2,它是通过安全密钥来访问主机的.问题是下载的密钥在SecureCRT 上无法直接使用,需要转换. 下面的方法可以在自己的linux主机上生成securecrt需要的密钥. 首先在 AWS 管理面板中生成密钥对.将密钥上传到一台自己的linux主机,下面举例文件名为 amazon-ec2-key.pem 修改亚马逊提供的密钥文件权限:chmod og-r amazon-ec2-key.pem 改写密钥格式为 OpenSSH,如果询问passphr

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

Windows 10定于下周7月29日正式发布. Windows 10家庭版119美元,专业版199美元,这个价格包括 Windows 10 授权. 版权声明:本文为博主原创文章,未经博主允许不得转载.