zoukankan      html  css  js  c++  java
  • DOS批处理高级教程:第七章 DOS批处理编程高级技巧(转)


    一、交互界面设计

    没啥说的,看看高手设计的菜单界面吧:
    1. @echo off
    2. cls
    3. title 终极多功能修复
    4. :menu
    5. cls
    6. color 0A
    7. echo.
    8. echo                 ==============================
    9. echo                 请选择要进行的操作,然后按回车
    10. echo                 ==============================
    11. echo.
    12. echo              1.网络修复及上网相关设置,修复IE,自定义屏蔽网站
    13. echo.
    14. echo              2.病毒专杀工具,端口关闭工具,关闭自动播放
    15. echo.
    16. echo              3.清除所有多余的自启动项目,修复系统错误
    17. echo.
    18. echo              4.清理系统垃圾,提高启动速度
    19. echo.
    20. echo              Q.退出
    21. echo.
    22. echo.
    23. :cho
    24. set choice=
    25. set /p choice=          请选择:
    26. IF NOT "%choice%"=="" SET choice=%choice:~0,1%
    27. if /i "%choice%"=="1" goto ip
    28. if /i "%choice%"=="2" goto setsave
    29. if /i "%choice%"=="3" goto kaiji
    30. if /i "%choice%"=="4" goto clean
    31. if /i "%choice%"=="Q" goto endd
    32. echo 选择无效,请重新输入
    33. echo.
    34. goto cho
    复制代码
    只要学完本教程前面的章节,上面的程序应该能看懂了。


    二、if…else…条件语句

    前面已经谈到,DOS条件语句主要有以下形式
    IF [NOT] ERRORLEVEL number command
    IF [NOT] string1==string2 command
    IF [NOT] EXIST filename command
    增强用法:IF [/I] string1 compare-op string2 command
    增强用法中加上/I就不区分大小写了!
    增强用法中还有一些用来判断数字的符号:

    EQU - 等于
    NEQ - 不等于
    LSS - 小于
    LEQ - 小于或等于
    GTR - 大于
    GEQ - 大于或等于

    上面的command命令都可以用小括号来使用多条命令的组合,包括else子句,组合命令中可以嵌套使用条件或循环命令。

    例如:

        IF EXIST filename (
            del filename
        ) ELSE (
            echo filename missing
        )

    也可写成:
    if exist filename (del filename) else (echo filename missing)

    但这种写法不适合命令太多或嵌套命令的使用。

    三、循环语句

    1、指定次数循环

    FOR /L %variable IN (start,step,end) DO command [command-parameters]

    组合命令:
    FOR /L %variable IN (start,step,end) DO (
    Command1
    Command2
    ……


    2、对某集合执行循环语句。

    FOR %%variable IN (set) DO command [command-parameters]

      %%variable  指定一个单一字母可替换的参数。
      (set)      指定一个或一组文件。可以使用通配符。
      command   对每个文件执行的命令,可用小括号使用多条命令组合。

    FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

        检查以 [drive:]path 为根的目录树,指向每个目录中的
        FOR 语句。如果在 /R 后没有指定目录,则使用当前
    目录。如果集仅为一个单点(.)字符,则枚举该目录树。

    同前面一样,command可以用括号来组合:
    FOR /R [[drive:]path] %variable IN (set) DO (
    Command1
    Command2
    ……
    commandn
    )

    3、条件循环

        上面的循环结构是用for命令来实现的,for命令循环有一个缺点,就是整个循环被当作一条命令语句,涉及到变量延迟的问题。
        利用goto语句和条件判断,dos可以实现条件循环,很简单啦,看例子:

    例:
    1. @echo off
    2. set var=0
    3. rem ************循环开始了
    4. :continue
    5. set /a var+=1
    6. echo 第%var%次循环
    7. if %var% lss 100 goto continue
    8. rem ************循环结束了
    9. echo 循环执行完毕
    10. pause
    复制代码
    例:
    1. @echo off
    2. set var=100
    3. rem ************循环开始了
    4. :continue
    5. echo 第%var%次循环
    6. set /a var-=1
    7. if %var% gtr 0 goto continue
    8. rem ************循环结束了
    9. echo 循环执行完毕
    10. pause
    复制代码
    四、子程序

    在批处理程序中可以调用外部可运行程序,比如exe程序,也可调用其他批处理程序,这些也可以看作子程序,但是不够方便,如果被调用的程序很多,就显得不够简明了,很繁琐。

    在windowsXP中,批处理可以调用本程序中的一个程序段,相当于子程序,这些子程序一般放在主程序后面。

    子程序调用格式:

    CALL :label arguments

    子程序语法:
    :label
    command1
    command2
    ......
    commandn
    goto :eof

    在子程序段中,参数%0指标签:label

    子过程一般放在最后,并且注意在主程序最后要加上exit或跳转语句,避免错误的进入子过程。

    子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。

    传至子程序的参数在call语句中指定,在子程序中用%1、%2至%9的形式调用,而子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量,请看下面的例子。

    子程序例1:
    1. @echo off
    2. call :sub return 你好
    3. echo 子程序返回值:%return%
    4. pause

    5. :sub
    6. set %1=%2
    7. goto :eof
    复制代码
    运行结果:你好

    子程序例2:设计一个求多个整数相加的子程序
    1. @echo off
    2. set sum=0
    3. call :sub sum 10 20 35
    4. echo 数据求和结果:%sum%
    5. pause

    6. :sub
    7. rem 参数1为返回变量名称
    8. set /a %1=%1+%2
    9. shift /2
    10. if not "%2"=="" goto sub
    11. goto :eof
    复制代码
    运行结果:65

    在win98系统中,不支持上面这种标号调用,须将子程序单独保存为一个批处理程序,然后调用。


    五、用ftp命令实现自动下载

    ftp是常用的下载工具,ftp界面中有40多个常用命令,自己学习了,不介绍了。这里介绍如何用dos命令行调用ftp命令,实现ftp自动登录,并上传下载,并自动退出ftp程序。

    其实可以将ftp命令组合保存为一个文本文件,然后用以下命令调用即可。

    ftp  -n -s:[[drive:]path]filename

    上面的filename为ftp命令文件,包括登录IP地址,用户名、密码、操作命令等
    例:
    open 90.52.8.3   #打开ip
    user iware       #用户为iware
    password8848    #密码
    bin             #二进制传输模式
    prompt
    cd tmp1         #切换至iware用户下的tmp1目录
    pwd
    lcd d:\download   #本地目录
    mget *          #下载tmp1目录下的所有文件
    bye             #退出ftp


    六、用7-ZIP实现命令行压缩和解压功能

    语法格式:(详细情况见7-zip帮助文件,看得头晕可以跳过,用到再学)

    7z <command> [<switch>...] <base_archive_name> [<arguments>...]

    7z.exe的每个命令都有不同的参数<switch>,请看帮助文件
    <base_archive_name>为压缩包名称
    <arguments>为文件名称,支持通配符或文件列表

    其中,7z是至命令行压缩解压程序7z.exe,<command>是7z.exe包含的命令,列举如下:

    a: Adds files to archive. 添加至压缩包
    a命令可用参数:
      -i (Include)
      -m (Method)
      -p (Set Password)
      -r (Recurse)
      -sfx (create SFX)
      -si (use StdIn)
      -so (use StdOut)
      -ssw (Compress shared files)
      -t (Type of archive)
      -u (Update)
      -v (Volumes)
      -w (Working Dir)
      -x (Exclude) 

    b: Benchmark 

    d: Deletes files from archive. 从压缩包中删除文件
    d命令可用参数:
      -i (Include)
      -m (Method)
      -p (Set Password)
      -r (Recurse)
      -u (Update)
      -w (Working Dir)
      -x (Exclude) 

    e: Extract解压文件至当前目录或指定目录
    e命令可用参数:
      -ai (Include archives)
      -an (Disable parsing of archive_name)
      -ao (Overwrite mode)
      -ax (Exclude archives)
      -i (Include)
      -o (Set Output Directory)
      -p (Set Password)
      -r (Recurse)
      -so (use StdOut)
      -x (Exclude)
      -y (Assume Yes on all queries) 

    l: Lists contents of archive.
    t: Test 
    u: Update 

    x: eXtract with full paths用文件的完整路径解压至当前目录或指定目录
    x命令可用参数:
      -ai (Include archives)
      -an (Disable parsing of archive_name)
      -ao (Overwrite mode)
      -ax (Exclude archives)
      -i (Include)
      -o (Set Output Directory)
      -p (Set Password)
      -r (Recurse)
      -so (use StdOut)
      -x (Exclude)
      -y (Assume Yes on all queries) 

    七、调用VBScript程序

    使用 Windows 脚本宿主,可以在命令提示符下运行脚本。CScript.exe 提供了用于设置脚本属性的命令行开关。

    用法:CScript 脚本名称 [脚本选项...] [脚本参数...]

    选项:
    //B         批模式:不显示脚本错误及提示信息
    //D         启用 Active Debugging
    //E:engine  使用执行脚本的引擎
    //H:CScript 将默认的脚本宿主改为 CScript.exe
    //H:WScript 将默认的脚本宿主改为 WScript.exe (默认)
    //I         交互模式(默认,与 //B 相对)
    //Job:xxxx  执行一个 WSF 工作
    //Logo      显示徽标(默认)
    //Nologo    不显示徽标:执行时不显示标志
    //S         为该用户保存当前命令行选项
    //T:nn      超时设定秒:允许脚本运行的最长时间
    //X         在调试器中执行脚本
    //U         用 Unicode 表示来自控制台的重定向 I/O

    “脚本名称”是带有扩展名和必需的路径信息的脚本文件名称,如d:\admin\vbscripts\chart.vbs。
    “脚本选项和参数”将传递给脚本。脚本参数前面有一个斜杠 (/)。每个参数都是可选的;但不能在未指定脚本名称的情况下指定脚本选项。如果未指定参数,则 CScript 将显示 CScript 语法和有效的宿主参数。

    八、将批处理转化为可执行文件:

    由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,不小心就会把里面的命令破坏掉,所以如果将其转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。Bat2Com就可以完成这个转换工作。

    小知识:在DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd,即如果在同一目录下存在文件名相同的这四类文件,当只键入文件名时,DOS执行的是name.com,如果需要执行其他三个文件,则必须指定文件的全名,如name.bat。

    这是一个只有5.43K大小的免费绿色工具,可以运行在纯DOS或DOS窗口的命令行中,用法:Bat2Com FileName,这样就会在同一目录下生成一个名为FileNme.com的可执行文件,执行的效果和原来的.bat文件一样。

    九、时间延迟

    什么是时间延迟?顾名思义,就是执行一条命令后延迟一段时间再进行下一条命令。

    延迟的应用见下节:“模拟进度条”。

    1、利用ping命令延时
    例:
    1. @echo off
    2. echo 延时前:%time%
    3. ping /n 3 127.0.0.1 >nul
    4. echo 延时后:%time%
    5. pause
    复制代码
    解说:用到了ping命令的“/n”参数,表示要发送多少次请求到指定的ip。本例中要发送3次请求到本机的ip(127.0.0.1)。127.0.0.1可简写为127.1。“>nul”就是屏蔽掉ping命令所显示的内容。

    2、利用for命令延时
    例:
    1. @echo off
    2. echo 延时前:%time%
    3. for /l %%i in (1,1,5000) do echo %%i>nul
    4. echo 延时后:%time%
    5. pause
    复制代码
    解说:原理很简单,就是利用一个计次循环并屏蔽它所显示的内容来达到延时的目的。

    3、利用vbs延迟函数,精确度毫秒,误差1000毫秒内

    例:
    1. @echo off
    2. echo %time%
    3. call :delay 5000
    4. echo %time%
    5. pause
    6. exit

    7. :delay
    8. echo WScript.Sleep %1>delay.vbs
    9. CScript //B delay.vbs
    10. del delay.vbs
    11. goto :eof
    复制代码
    运行显示:
    10:44:06.45
    10:44:11.95
    请按任意键继续. . .

    上面的运行结果显示实际延时了5500毫秒,多出来的500毫秒时建立和删除临时文件所耗费的时间。误差在一秒之内。

    4、仅用批处理命令实现任意时间延迟,精确度10毫秒,误差50毫秒内

    仅用批处理命令就可以实现延迟操作。

    例:
    1. @echo off
    2. set /p delay=请输入需延迟的毫秒数:
    3. set TotalTime=0
    4. set NowTime=%time%
    5. ::读取起始时间,时间格式为:13:01:05.95
    6. echo 程序开始时间:%NowTime%
    7. :delay_continue
    8. set /a minute1=1%NowTime:~3,2%-100
    9. ::读取起始时间的分钟数
    10. set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
    11. ::将起始时间的秒数转为毫秒
    12. set NowTime=%time%
    13. set /a minute2=1%NowTime:~3,2%-100
    14. :: 读取现在时间的分钟数
    15. set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
    16. ::将现在时间的秒数转为毫秒
    17. set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
    18. if %TotalTime% lss %delay% goto delay_continue
    19. echo 程序结束时间:%time%
    20. echo 设定延迟时间:%delay%毫秒
    21. echo 实际延迟时间:%TotalTime%毫秒
    22. pause
    复制代码
    运行显示:

       请输入需延迟的毫秒数:6000
       程序开始时间:15:32:16.37
       程序结束时间:15:32:22.37
       设定延迟时间:6000毫秒
       实际延迟时间:6000毫秒
       请按任意键继续. . .

    实现原理:首先设定要延迟的毫秒数,然后用循环累加时间,直到累加时间大于等于延迟时间。

    误差:windows系统时间只能精确到10毫秒,所以理论上有可能存在10毫秒误差。
    经测试,当延迟时间大于500毫秒时,上面的延迟程序一般不存在误差。当延迟时间小于500毫秒时,可能有几十毫秒误差,为什么?因为延迟程序本身也是有运行时间的,同时系统时间只能精确到10毫秒。

    为了方便引用,可将上面的例子改为子程序调用形式:
    1. @echo off
    2. echo 程序开始时间:%Time%
    3. call :delay 10
    4. echo 实际延迟时间:%totaltime%毫秒
    5. echo 程序结束时间:%time%
    6. pause
    7. exit

    8. ::-----------以下为延时子程序--------------------
    9. :delay
    10. @echo off
    11. if "%1"=="" goto :eof
    12. set DelayTime=%1
    13. set TotalTime=0
    14. set NowTime=%time%
    15. ::读取起始时间,时间格式为:13:01:05.95
    16. :delay_continue
    17. set /a minute1=1%NowTime:~3,2%-100
    18. set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
    19. set NowTime=%time%
    20. set /a minute2=1%NowTime:~3,2%-100
    21. set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
    22. set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
    23. if %TotalTime% lss %DelayTime% goto delay_continue
    24. goto :eof
    复制代码
    十、模拟进度条

    下面给出一个模拟进度条的程序。如果将它运用在你自己的程序中,可以使你的程序更漂亮。
    1. @echo off
    2. mode con cols=113 lines=15 &color 9f
    3. cls
    4. echo.
    5. echo  程序正在初始化. . . 
    6. echo.
    7. echo  ┌──────────────────────────────────────┐
    8. set/p=  ■<nul
    9. for /L %%i in (1 1 38) do set /p a=■<nul&ping /n 1 127.0.0.1>nul
    10. echo   100%%
    11. echo  └──────────────────────────────────────┘
    12. pause
    复制代码
    解说:“set /p a=■<nul”的意思是:只显示提示信息“■”且不换行,也不需手工输入任何信息,这样可以使每个“■”在同一行逐个输出。“ping /n 0 127.1>nul”是输出每个“■”的时间间隔,即每隔多少时间输出一个“■”。

    十一、特殊字符的输入及应用

    开始 -> 运行 -> 输入cmd -> edit -> ctrl+p(意思是允许输入特殊字符)-> 按ctrl+a将会显示笑脸图案。

    (如果要继续输入特殊字符请再次按ctrl+p,然后ctrl+某个字母)

    以上是特殊字符的输入方法,选自[英雄]教程,很管用的。也就是用编辑程序edit输入特殊字符,然后保存为一文本文件,再在windows下打开此文件,复制其中的特殊符号即可。

    一些简单的特殊符号可以在dos命令窗口直接输入,并用重定向保存为文本文件。
    例:

    C:>ECHO ^G>temp.txt
    “^G”是用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。

    特殊字符的应用也很有意思,这里仅举一例:退格键

    退格键表示删除左边的字符,此键不能在文档中正常输入,但可以通过edit编辑程序录入并复制出来。即“”。

    利用退格键,可以设计闪烁文字效果

    例:文字闪烁
    1. @echo off
    2. :start
    3. set/p=床前明月光<nul
    4. ::显示文字,光标停于行尾
    5. ping -n 0 127.0.0.1>nul
    6. ::设置延迟时间
    7. set /p a=<nul
    8. :: 输出一些退格符将光标置于该行的最左端(退格符的数量可以自己调整)。
    9. set /p a=                               <nul
    10. ::输出空格将之前输出的文字覆盖掉。
    11. set /p a=<nul
    12. ::再次输出退格符将光标置于该行的最左端,这里的退格符数量一定不能比前面的空格数少。
    13. ::否则光标不能退到最左端。
    14. goto start
    复制代码
    例:输出唐诗一首,每行闪动多次
    1. @echo off
    2. setlocal enabledelayedexpansion
    复制代码
    set str=床前明月光 疑是地上霜 举头望明月 低头思故乡
    1. ::定义字符串str
    2. for %%i in (%str%) do (
    3. rem 由于str中含有空格,则以空格为分隔符将str中的每一个部分依次赋给变量%%i。
    4.         set char=%%i
    5.         echo.
    6.         echo.
    7.         for /l %%j in (0,1,5) do (
    8.                 set/p=!char:~%%j,1!<nul
    9.   rem 依次取出变量char中的每一个字符,并显示。
    10.                 ping -n 0 127.0.0.1>nul
    11.   rem 设置输出每个字符的时间延迟。
    12.         )
    13. call :hero %%i
    14. )
    15. pause>nul
    16. exit

    17. :hero
    18. for /l %%k in (1,1,10) do (
    19. ping /n 0 127.0.0.1>nul
    20. set /p a=<nul
    21. set /p a=                               <nul
    22. set /p a=<nul
    23. ping /n 0 127.0.0.1>nul
    24. set /p a=%1<nul
    25. )
    26. ::文字闪动
    27. goto :eof
    复制代码
    十二、随机数(%random%)的应用技巧

    %RANDOM% 系统变量 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。

    2的15次方等于32768,上面的0~32767实际就是15位二进制数的范围。

    那么,如何获取100以内的随机数呢?很简单,将%RANDOM%按100进行求余运算即可,见例子。

    例:生成5个100以内的随机数
    1. @echo off
    2. setlocal enabledelayedexpansion
    3. for /L %%i in (1 1 5) do (
    4.    set /a randomNum=!random!%%100
    5.    echo 随机数:!randomNum!
    6. )
    7. pause
    复制代码
    运行结果:(每次运行不一样)
    随机数:91
    随机数:67
    随机数:58
    随机数:26
    随机数:20
    请按任意键继续. . .

    求余数运算set /a randomNum=!random!%%100中的100可以是1~32768之间的任意整数。

    总结:利用系统变量%random%,求余数运算%%,字符串处理等,可以实现很多随机处理。

    思考题目:生成给定位数的随机密码

    解答思路:将26个英文字母或10数字以及其它特殊字符组成一个字符串,随机抽取其中的若干字符。

    参考答案1:(简单)
    1. @echo off
    2. call :randomPassword 5 pass1 pass2
    3. echo %pass1% %pass2% 
    4. pause
    5. exit

    6. :randomPassword
    7. ::---------生成随机密码
    8. ::---------%1为密码长度,%2及以后为返回变量名称
    9. ::---------for命令最多只能区分31个字段
    10. @echo off
    11. set password_len=%1
    12. if not defined password_len goto :eof
    13. if %password_len% lss 1 goto :eof
    14. set wordset=a b c d e f g h i j k l m n o p q r s t u v w x y z
    15. set return=
    16. set num=0
    17. :randomPassword1
    18. set /a num+=1
    19. set /a numof=%random%%%26+1
    20. for /f "tokens=%numof% delims= " %%i in ("%wordset%") do set return=%return%%%i
    21. if %num% lss %password_len% goto randomPassword1
    22. if not "%2"=="" set %2=%return%
    23. shift /2
    24. if not "%2"=="" goto randomPassword
    25. goto :eof
    复制代码
    参考答案2:(最优)
    1. @echo off
    2. call :randomPassword 6 pass1 pass2 pass3
    3. echo %pass1% %pass2% %pass3%
    4. pause
    5. exit

    6. :randomPassword
    7. ::---------生成随机密码
    8. ::---------%1为密码长度,%2及以后为返回变量名称
    9. ::---------goto循环、变量嵌套、命令嵌套
    10. @echo off
    11. if "%1"=="" goto :eof
    12. if %1 lss 1 goto :eof
    13. set password_len=%1
    14. set return=
    15. set wordset=abcdefghijklmnopqrstuvwxyz023456789_
    16. ::---------------------------循环
    17. :randomPassword1
    18. set /a numof=%random%%%36
    19. call set return=%return%%%wordset:~%numof%,1%%
    20. set /a password_len-=1
    21. if %password_len% gtr 0 goto randomPassword1
    22. ::---------------------------循环
    23. if not "%2"=="" set %2=%return%
    24. shift /2
    25. if not "%2"=="" goto randomPassword
    26. goto :eof
    复制代码
    说明:本例涉及到变量嵌套和命令嵌套的应用,见后。


    十三、变量嵌套 与 命令嵌套

    和其它编程语言相比,dos功能显得相对简单,要实现比较复杂的功能,需要充分运用各种技巧,变量嵌套与命令嵌套就是此类技巧之一。

    先复习一下前面的“字符串截取”的关键内容:

    **********************************************
    截取功能统一语法格式为:%a:~[m[,n]]%
    **********************************************

    方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)。

    百分号如果需要当成单一字符,必须写成%%

    以上是dos变量处理的通用格式,如果其中的m、n为变量,那么这种情况就是变量嵌套了。

    比如设变量word为“abcdefghij”,变量num为“123456789”
    %word:~4,1%为e,其中4可以从变量num中取值,即%num:~3,1%,写成组合形式如下:
    %word:~%num:~3,1%,1% 经测试这种写法不能正确执行,写成%word:~(%num:~3,1%),1%同样不行,那么,怎么实现这种变量嵌套呢?这就必须结合命令嵌套。

    什么是命令嵌套呢?简单的说,首先用一条dos命令生成一个字符串,而这个字符串是另一条dos命令,用call语句调用字符串将其执行,从而得到最终结果。

    例:用call语句实现命令嵌套
    1. @echo off
    2. set str1=aaa echo ok bbb
    3. echo 初始字符串:%str1%
    4. echo 生成命令字符串如下:
    5. echo %str1:~4,7%
    6. echo 运行命令字符串生成最终结果为:
    7. call %str1:~4,7%
    8. pause
    复制代码
    运行显示:
    初始字符串:aaa echo ok bbb
    生成命令字符串如下:
    echo ok
    运行命令字符串生成最终结果为:
    ok

    请按任意键继续. . .

    转自:http://club.topsage.com/thread-597604-1-1.html 

  • 相关阅读:
    JAVA基础——编程练习(二)
    JAVA基础——面向对象三大特性:封装、继承、多态
    JVM内存
    50. Pow(x, n) (JAVA)
    47. Permutations II (JAVA)
    46. Permutations (JAVA)
    45. Jump Game II (JAVA)
    43. Multiply Strings (JAVA)
    42. Trapping Rain Water (JAVA)
    41. First Missing Positive (JAVA)
  • 原文地址:https://www.cnblogs.com/zhangpengshou/p/2203894.html
Copyright © 2011-2022 走看看