12
返回列表 发新帖
楼主: garyyang
跳转到指定楼层
上一主题 下一主题
收起左侧

[动态规划] 某公司OA最佳算法是?

🔗
 楼主| garyyang 2019-2-24 09:54:24 | 只看该作者
全局:
我用了三种方法,一种是 变成String 翻过来再转回数,一种是算出reversed,最后是递归实现 “板凳”的算法。



以下代码输出:
String[0==>>>999999999]>>sum>>1000000010>>ss>>198899time>23437
Math[0==>>>999999999]>>sum>>1000000010>>ss>>198899time>11956
Recursive:::198900@@@time>12146

Recursive效率应该很高,但是我的实现有两个问题:
1,要复制已有的数字,组合新的Set,很大程度降低了效率;
2,sum不是增加的,不能像前两种算法设置一个最大限;


还请各位高人指点。


  1.     public static void main( String[] a ){


  2.         long time = System.currentTimeMillis();
  3.         long sum = 0;
  4.         int start = 0;
  5.         final int end = 999999999;
  6.         HashSet<Long> set = new HashSet<>();
  7.         for( int i = start; i < Integer.MAX_VALUE; i++ ){
  8.             int reversed = Integer.parseInt( new StringBuilder( Integer.toString( i ) ).reverse().toString() );
  9.             sum = i + reversed;
  10.             if( sum > end ){
  11.                 break;
  12.             }
  13.             set.add( sum );
  14.         }

  15.         long cost = System.currentTimeMillis() - time;
  16.         System.out.println( "String[" + start + "==>>>" + end + "]>>sum>>" + sum + ">>ss>>" + set.size() + "time>" + cost );

  17.         limit = set.size();
  18.         time = System.currentTimeMillis();

  19.         set = new HashSet<>();

  20.         for( int i = start; i < Integer.MAX_VALUE; i++ ){

  21.             int reversed = 0;
  22.             if( i >= 10 ){
  23.                 int f = i;
  24.                 while( f > 0 ){
  25.                     int m = f % 10;
  26.                     if( f >= 10 ){
  27.                         f = f / 10;
  28.                     }
  29.                     else{
  30.                         f = 0;
  31.                     }
  32.                     if( reversed > 0 ){
  33.                         reversed *= 10;
  34.                     }
  35.                     reversed += m;
  36.                 }
  37.             }
  38.             else{
  39.                 reversed = i;
  40.             }
  41.             sum = i + reversed;
  42.             if( sum > end ){
  43.                 break;
  44.             }
  45.             set.add( sum );
  46.         }

  47.         cost = System.currentTimeMillis() - time;
  48.         System.out.println( "Math[" + start + "==>>>" + end + "]>>sum>>" + sum + ">>ss>>" + set.size() + "time>" + cost );



  49.         /*
  50.          * 10000*a+ 1000*b+ 100*c + 10*d + e
  51.          * 10000*e+ 1000*d+ 100*c + 10*b + a
  52.          *
  53.          * 10001*a+ 1010*b+ 200*c + 1010*b + 10001*e
  54.          * */
  55.         int len = 10;

  56.         long[] tenArr = new long[ len ];
  57.         tenArr[ 0 ] = 1;
  58.         for( int i = 1; i < len; i++ ){
  59.             tenArr[ i ] = tenArr[ i - 1 ] * 10;
  60.         }

  61.         long[] eighteenArr = new long[ len ];

  62.         for( int i = 0; i < len; i++ ){
  63.             eighteenArr[ i ] = tenArr[ i ] + tenArr[ len - i - 1 ];
  64.         }

  65.         HashSet<Long> rslt = treeWalk( 0, eighteenArr );

  66.         cost = System.currentTimeMillis() - time;
  67.         System.out.println( "Recursive:::" + rslt.size() + "@@@time>" + cost );


  68.     }

  69.     static int limit;

  70.     private static HashSet<Long> treeWalk( int position, long[] eighteenArr ){
  71.         HashSet<Long> theMap;
  72.         long currentVal = eighteenArr[ position ];
  73.         if( position == eighteenArr.length - 1 ){
  74.             theMap = new HashSet<>();
  75.             for( int i = 0; i < 19; i++ ){
  76.                 long baseI = i * currentVal;
  77.                 theMap.add( baseI );
  78.             }
  79.         }
  80.         else{
  81.             theMap = treeWalk( position + 1, eighteenArr );

  82.             HashSet<Long> prevSumKeySet = new HashSet( theMap );
  83.             for( int i = 0; i < 19; i++ ){
  84.                 long newVal = currentVal * i;
  85.                 for( Long prevSumKey: prevSumKeySet ){
  86.                     theMap.add( newVal + prevSumKey );
  87.                     if( theMap.size() > limit ){
  88.                         return theMap;
  89.                     }
  90.                 }
  91.             }
  92.         }
  93.         return theMap;
  94.     }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表