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

在问答区看到这个问题,下面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

时间: 2024-09-17 19:48:07

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

算法-java有1234个数字能组成多少个有两个重复的3位数字

问题描述 java有1234个数字能组成多少个有两个重复的3位数字 java有1234四数字能组成多少个有两个重复的3位数字,java有1234四数字能组成多少个有两个重复的3位数字,java有1234四数字能组成多少个有两个重复的3位数字 解决方案 2 6*C 1234 解决方案二: 6*C下面是1234,上面是2 解决方案三: 如果我没理解错你的意思,那么这题是一个从四个数字中选出两个进行三位数字的排列组合的问题.根据大学(还是高中?)的排列组合知识就是: C2/4 乘以 3 =36种,具体

重磅 | 央行探索法定数字货币,数字票据交易平台原型系统测试成功

据雷锋网2016年12月28日报道,央行基于区块链的数字货币研究已取得阶段性成果,原型方案已初步确定,法定数字货币的原型系统Demo有望在春节后推出.此前,央行发行法定数字货币的原型方案已完成两轮修订. 今天,据财新网消息,央行推动的基于区块链的数字票据交易平台已测试成功,由央行发行的法定数字货币已在该平台试运行,近期将成立研发中心持续完善;春节后央行旗下的数字货币研究所也将正式挂牌. 这意味着在全球范围内,中国央行将成为首个发行数字货币并开展真实应用的中央银行,并率先探索了区块链的实际应用.

把全角数字转为半角数字

 //把全角数字转为半角数字  <?  function GetAlabNum($fnum){  $nums = array("0","1","2","3","4","5","6","7","8","9"); //OSPHP.com.CN $fnums = "0123456789";

如何将Excel的文本数字转换成数字

  如何将Excel的文本数字转换成数字: 在Excel中,系统将前面带有半角单引号的数字视为文本对待,而且为了某些需要,用户可以通过"格式"菜单中的"单元格"命令,将数字设置为文本格式.然而,现在我们却需要把工作表中文本格式的数字转换成数字,那么以下方法可以一试. 1.一次转换一个单元格 在"工具"菜单上,单击"选项",再单击"错误检查"选项卡(一定要确保选中了"允许后台错误检查"和&

李礼辉:区分数字货币与数字代币,数字货币代表货币的未来

9月15日报道,中国互联网金融协会区块链工作组组长李礼辉在今日上海举行的峰会上发表了有关数字货币与虚拟货币的演讲. 他指出,数字货币必须具备法定地位,国家主权背书,明确发行责任主体.而这区别于以比特币.以太币为代表的数字代币,没有国别.主权背书.合格的发行主体.国家信用支撑,不是法定货币,也谈不上数字货币.但在受认可的社区内,已经作为支付工具.记账单位,具有金融工具属性,可以定义为虚拟货币. "我们需要分清法定数字货币和数字代币.由于可匿名等特性,容易藏匿较大的风险,金融诈骗时有发生.各国的态度

Java工作利器之常用工具类(一)——数字工具类-数字转汉字

本人是从事互联网金融行业的,所以会接触到一些金融类的问题,常见的一种就是数字转汉字大小写的问题.所以抽空就写了一个小小的工具类,实现了数字转汉字.大数相加.相减.相乘的工具类,希望能帮助有需求的同行们.本篇就分享一下数字转化为汉字的思路吧. 数字转汉字的原理: 拆分:由于整数部分要加权值,而小数部分直接转换即可,所以首先要将数字拆分成整数+小数: 整数处理:按照我们的中国人的习惯,把数字格式化成4位一组,不足4位前面补0.每次处理4位,按位匹配数组中的汉字+权值.即按照数值找数字数组(num_l

js实现文本框只允许输入数字并限制数字大小的方法_javascript技巧

本文实例讲述了js实现文本框只允许输入数字并限制数字大小的方法.分享给大家供大家参考.具体如下: 这是一个很个性的输入框特效,规定文本框只允许输入数字,如果你执意要输入其它的字符,则输入的字符将自动消失,除非你输入的是规定内的字符格式,并且对输入数字大小也有限制!为保证兼容性,请使用火狐浏览器. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-input-limit-num-codes/ 具体代码如下: <!DOCTYPE html PUB

c语言-x是素数,且其各位数字以及各位数字之和都是素数

问题描述 x是素数,且其各位数字以及各位数字之和都是素数 用C语言编写程序找出2到5000中满足条件的素数x,x是素数且其各位数字以及各位数字之和都为素数 解决方案 这个程序要分割成几个小的功能来实现 解决方案二: http://zhidao.baidu.com/link?url=uJUPRttFD4y_gAziUtSQY3q6QHS9NUfEzgyh79GXiJI1bE0ZYVGz7UkICMKlF8xrrXVvZ9Yzg5oE4yKa8YFwkq

java-Java中要求输入一个数字,该数字只能在另外两个数值之间,如果不满足要求重新输入。

问题描述 Java中要求输入一个数字,该数字只能在另外两个数值之间,如果不满足要求重新输入. 新手求教!Java中要求输入一个数字,该数字只能在另外两个数值之间,如果不满足要求重新输入. 解决方案 做一个循环,条件是比较这个数.不满足就循环就可以了. 解决方案二: 设定一个标记变量 public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int x