如何打印没有重复数字的自然数字列表?

简介:

在问答区看到这个问题,下面7788的回答,真是千奇百怪。

因此,花了几分钟写了一下,不一定是最优解,但是效率和速度应该还可以,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class Test1 {
   public static void main(String[] args) {
    long start = System.currentTimeMillis();
    for ( int i = 1 ; i <= 10 ; i++) {
      printNumberNotRepeat(i, new ArrayList<Integer>());
      System.out.println();
    }
    long end = System.currentTimeMillis();
    System.out.println(end - start);
   }
   private static void printNumberNotRepeat( int length,
      ArrayList<Integer> numberList) {
    for ( int n = 0 ; n <= 9 ; n++) {
      if (numberList.contains(n)) {
        continue ;
      } else {
        ArrayList<Integer> newList = new ArrayList<Integer>(numberList);
        newList.add(n);
        if (length > 1 ) {
          if (newList.get( 0 ) == 0 ) {
            continue ; // 如果是以0开头,则结束
          }
          printNumberNotRepeat(length - 1 , newList);
        } else {
            //print(newList);//暂时注释是为了避免打印花费太长时间
        }
      }
    }
   }
   private static void print(ArrayList<Integer> newList) {
    for ( int i : newList) {
      System.out.print(i);
    }
    System.out.print( " " );
   }
}
简单剖析:
?
1
2
3
4
5
6
7
8
9
   public static void main(String[] args) {
    long start = System.currentTimeMillis();
    for ( int i = 1 ; i <= 10 ; i++) {
      printNumberNotRepeat(i, new ArrayList<Integer>());
      System.out.println();
    }
    long end = System.currentTimeMillis();
    System.out.println(end - start);
   }
main方法,主要进行计时,同时调用方法来对10位以内非重复数字进行查找。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   private static void printNumberNotRepeat( int length,
      ArrayList<Integer> numberList) {
    for ( int n = 0 ; n <= 9 ; n++) {
      if (numberList.contains(n)) {
        continue ;
      } else {
        ArrayList<Integer> newList = new ArrayList<Integer>(numberList);
        newList.add(n);
        if (length > 1 ) {
          if (newList.get( 0 ) == 0 ) {
            continue ; // 如果是以0开头,则结束
          }
          printNumberNotRepeat(length - 1 , newList);
        } else {
            print(newList); //暂时注释是为了避免打印花费太长时间
        }
      }
    }
   }
核心算法,用于打印指定长度的非空自然数,采用了递归算法。

参数length表示计算的层数,每递归一次少一。

由于数字是不断增加的,因此必须每多一个数字,都要新建一个对象,程序逻辑中还避免了以0开头的多位数。

不一定是最优解(理论上上一层算过的值下一次还是有用的,因此还可以优化,哪位大神写写看?),但是效率应该还算可以,在本人笔记本上大概3545ms左右。当然上面的算法有个好处是打印的结果还是自然数的序列,没有乱序。

打印3层的解如下

?
1
2
3
0 1 2 3 4 5 6 7 8 9
10 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 39 40 41 42 43 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98
102 103 104 105 106 107 108 109 120 123 124 125 126 127 128 129 130 132 134 135 136 137 138 139 140 142 143 145 146 147 148 149 150 152 153 154 156 157 158 159 160 162 163 164 165 167 168 169 170 172 173 174 175 176 178 179 180 182 183 184 185 186 187 189 190 192 193 194 195 196 197 198 201 203 204 205 206 207 208 209 210 213 214 215 216 217 218 219 230 231 234 235 236 237 238 239 240 241 243 245 246 247 248 249 250 251 253 254 256 257 258 259 260 261 263 264 265 267 268 269 270 271 273 274 275 276 278 279 280 281 283 284 285 286 287 289 290 291 293 294 295 296 297 298 301 302 304 305 306 307 308 309 310 312 314 315 316 317 318 319 320 321 324 325 326 327 328 329 340 341 342 345 346 347 348 349 350 351 352 354 356 357 358 359 360 361 362 364 365 367 368 369 370 371 372 374 375 376 378 379 380 381 382 384 385 386 387 389 390 391 392 394 395 396 397 398 401 402 403 405 406 407 408 409 410 412 413 415 416 417 418 419 420 421 423 425 426 427 428 429 430 431 432 435 436 437 438 439 450 451 452 453 456 457 458 459 460 461 462 463 465 467 468 469 470 471 472 473 475 476 478 479 480 481 482 483 485 486 487 489 490 491 492 493 495 496 497 498 501 502 503 504 506 507 508 509 510 512 513 514 516 517 518 519 520 521 523 524 526 527 528 529 530 531 532 534 536 537 538 539 540 541 542 543 546 547 548 549 560 561 562 563 564 567 568 569 570 571 572 573 574 576 578 579 580 581 582 583 584 586 587 589 590 591 592 593 594 596 597 598 601 602 603 604 605 607 608 609 610 612 613 614 615 617 618 619 620 621 623 624 625 627 628 629 630 631 632 634 635 637 638 639 640 641 642 643 645 647 648 649 650 651 652 653 654 657 658 659 670 671 672 673 674 675 678 679 680 681 682 683 684 685 687 689 690 691 692 693 694 695 697 698 701 702 703 704 705 706 708 709 710 712 713 714 715 716 718 719 720 721 723 724 725 726 728 729 730 731 732 734 735 736 738 739 740 741 742 743 745 746 748 749 750 751 752 753 754 756 758 759 760 761 762 763 764 765 768 769 780 781 782 783 784 785 786 789 790 791 792 793 794 795 796 798 801 802 803 804 805 806 807 809 810 812 813 814 815 816 817 819 820 821 823 824 825 826 827 829 830 831 832 834 835 836 837 839 840 841 842 843 845 846 847 849 850 851 852 853 854 856 857 859 860 861 862 863 864 865 867 869 870 871 872 873 874 875 876 879 890 891 892 893 894 895 896 897 901 902 903 904 905 906 907 908 910 912 913 914 915 916 917 918 920 921 923 924 925 926 927 928 930 931 932 934 935 936 937 938 940 941 942 943 945 946 947 948 950 951 952 953 954 956 957 958 960 961 962 963 964 965 967 968 970 971 972 973 974 975 976 978 980 981 982 983 984 985 986 987
相关文章
给定一个正整数N,将其表示为数字1,3,7,15相加的形式输出。请编码找出使上述数字出现的总次数最少(每个数字可以重复使用)的组合。
给定一个正整数N,将其表示为数字1,3,7,15相加的形式输出。请编码找出使上述数字出现的总次数最少(每个数字可以重复使用)的组合。
|
5月前
去除数组中重复的那个数字
去除数组中重复的那个数字
|
7月前
|
存储 弹性计算 运维
判断数字大小
【4月更文挑战第29天】
44 1
|
7月前
|
存储 算法 数据处理
删除重复数字
删除重复数字
|
7月前
字符串,每个里面包含0-N个数字,如3,8,2,编写函数,将两个这样的字符串合并,并且输出的字符串里面没有重复的数字,并从大到小排列.
字符串,每个里面包含0-N个数字,如3,8,2,编写函数,将两个这样的字符串合并,并且输出的字符串里面没有重复的数字,并从大到小排列.
39 0
|
存储 算法 JavaScript
寻找数组中的重复数字
寻找数组中的重复数字
寻找数组中的重复数字
|
机器学习/深度学习 Java
Java数字黑洞给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到 一个新的数字。一直重复这样做,我们很快会停在有“数字
Java数字黑洞给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到 一个新的数字。一直重复这样做,我们很快会停在有“数字
142 0
每日一更1009:数字的处理与判断
题目描述: 给出一个不多于5位的整数,要求 1、求出它是几位数 2、分别输出每一位数字 3、按逆序输出各位数字,例如原数为321,应输出123
66 0