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

本文提供了一种使用Java实现的生成非重复数字序列的方法。通过递归算法,该方法能够生成指定长度的非重复自然数序列,并确保不会出现以0开头的数字。代码运行效率较高,适用于快速生成特定长度的非重复数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在问答区看到这个问题,下面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
1. 用户与权限管理模块 角色管理: 学生:查看实验室信息、预约设备、提交耗材申请、参与安全考核 教师:管理课题组预约、审批学生耗材申请、查看本课题组使用记录 管理员:设备全生命周期管理、审核预约、耗材采购与分发、安全检查 用户操作: 登录认证:统一身份认证(对接学号 / 工号系统,模拟实现),支持密码重置 信息管理:学生 / 教师维护个人信息(联系方式、所属院系),管理员管理所有用户 权限控制:同角色仅可见对应功能(如学生可删除设备信息) 2. 实验室与设备管理模块 实验室信息管理: 基础信息:实验室编号、名称、位置、容纳人数、开放时间、负责人 功能分类:按学科(计算机实验室 / 电子实验室 / 化学实验室)标记,关联可开展实验类型 状态展示:实时显示当前使用人数、设备运行状态(正常 / 故障) 设备管理: 设备档案:名称、型号、规格、购置日期、单价、生产厂家、存放位置、责任人 全生命周期管理: 入库登记:管理员录入新设备信息,生成唯一资产编号 维护记录:记录维修、校准、保养信息(时间、内容、执行人) 报废处理:登记报废原因、时间,更新设备状态为 "已报废" 设备查询:支持按名称、型号、状态多条件检索,显示设备当前可用情况 3. 预约与使用模块 预约管理: 预约规则:学生可预约未来 7 天内的设备 / 实验室,单次最长 4 小时(可设置) 预约流程:选择实验室→选择设备→选择时间段→提交申请(需填写实验目的) 审核机制:普通实验自动通过,高危实验(如化学实验)需教师审核 使用记录: 签到 / 签退:到达实验室后扫码签到,离开时签退,系统自动记录实际使用时长 使用登记:填写实验内容、设备运行情况(正常 / 异常),异常情况需详细描述 违规管理:迟到 15 分钟自动取消预约,多次违规限制预约权限 4. 耗材与安全管理模块 耗材管理: 耗材档案:名称、规格、数量、存放位置、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值