复杂问题简单化

把数组排成最小的数

http://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993

不想有多少排列组合,就想着当前数组中有两个数,怎么返回最小的数?
写一个compare方法比较就行
那么再往后想,三个数呢?先比较前两个,再拿前两个的结果与后面的数compare
但是大前提是数组是从小到大排列的,从小到大才能保证每一步都是当前最小
所以算法如下

  • 首先判空,任何题都要考虑传入空值,边界值等条件

  • 然后排序,取第一个作为结果

  • 然后依次拿第一个与第二个比较compare求组合的最小

  • 拿第一个与第二个求出的最小与第三个比较

  • ...

  • 一直到最后
    代码如下:

    public String PrintMinNumber(int [] numbers) {
          if (numbers == null || numbers.length == 0) {
              return "";
          }
          Arrays.sort(numbers);
          String result = String.valueOf(numbers[0]);
          for (int i=1; i<numbers.length; i++) {
              result = compareTwoNumbers(numbers[i] + result, result + "" + numbers[i]);
          }
          return result;
      }
    
      /**
       * 比较两个数的大小,返回较小的数
       */
      String compareTwoNumbers(String a, String b) {
          // 此处两个数长度肯定相等,因为是前后位置变换得到的两个数
          for (int i=0; i<a.length(); i++) {
              if (a.charAt(i) != b.charAt(i)) {
                  return a.charAt(i) < b.charAt(i) ? a : b;
              }
          }
          // 如果比较完之后都没有不相等的字符,就随便返回一个就行,因为两数相等
          return a;
      }
全部评论

相关推荐

白火同学:只是实习的话,你这份简历应该也差不多了。真要优化的话,因为面实习的话,没有开发经验,面试更重视技术栈水平。 1、重视JavaSE的基础吧,集合、泛型算是比较基础的基础,多线程、反射、JVM内存模型才是基础; 2、技术栈写到具体的点,比如Elasticsearch的使用写到某个点,限制面试官自由发挥,防止问了相关问题最后又答不上,如果真没把握建议不写,降低面试官的心理预期; 3、技术栈不要重复,比如技术栈第二条和第八条可以合并改为“熟悉Redis中间件,包括基本数据结构、缓存策略、持久化机制,了解缓存三剑客及其解决方案,并有相关项目经验。”; 4、项目指标量化,比如“达到xx秒的响应速度”(不过这个就有点偏校招社招的要求了,实习简历不写也无伤大雅)。
点赞 评论 收藏
分享
榕城小榕树:1200单休,我去干点啥别的不好
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务