[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [已解决]批处理删除给定数字串的一部分使剩余数字升序或降序排列

偶尔看到这一个问题
例子:
  1. 1 2 55 3 4 5 1 7 8 9
  2. 然后结果是
  3. 删去 55 1
  4. 或者直接给出排列好的数列 1 2 3 4 5 7 8 9
复制代码
如果用数直接比对以前的数 那效率一定很低 这里求代码的简约 高效
大家有什么好的方案
注:
数字不能换位子
例如 1 2 3 4 5 6 10 9
答案应为 1 2 3 4 5 6 9
而不是1 2 3 4 5 6 9 10
8L的说得对
基础的 那只要求以第一个数为基准 给出一种答案就可以了 但升序的数组不可以有遗留哦
也就是本来可以1 2 3 4 5 6 9的 不能少数字 变成 1 3 4 5 6 9或其他的
加深的:
找出删去数最少 也就是令这个升序数组最长的答案

[ 本帖最后由 基拉freedom 于 2009-10-2 20:41 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2
o(∩_∩)o...~~~
空间:http://hi.baidu.com/fair_jm
喜欢批处理的没事的话去逛逛哦~~

就批处理而言 冒泡排还是快的
然后在循环里判断连续数否

TOP

但这样怎么实现呢
因为排序后位置都改变了 怎么能知道要删除去的是那个数呢?
o(∩_∩)o...~~~
空间:http://hi.baidu.com/fair_jm
喜欢批处理的没事的话去逛逛哦~~

TOP

前面排序都一样 后面判断稍不同
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=1 2 55 3 4 5 1 7 8 9"
  3. for %%i in (!str!) do (
  4.     if not defined .%%i (
  5.        set /a n+=1
  6.        set "_!n!=%%i"&set .%%i=a
  7.   ))
  8.          set /a m=n-1
  9.          for /l %%i in (1,1,!m!) do (
  10.          set /a e=%%i+1
  11.          for /l %%j in (!e!,1,!n!) do (
  12.          if !_%%i! gtr !_%%j! set/a _%%j=!_%%i!,_%%i=!_%%j!
  13.         )
  14.      )
  15.     for /l %%i in (1,1,!n!) do (
  16.     if !s1! equ !_%%i! (
  17.     set/a s1-=1
  18.     if defined ..!s1! (set var=!var! !_%%i!)else set var=!var! !s1! !_%%i!
  19.     set ..!_%%i!=.
  20.    )
  21.     set/a s1=_%%i+1
  22. )
  23. echo!var!
  24. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=2 2 12 3 4 5 11 7 8 9"
  3. for %%i in (!str!) do (
  4.     if not defined .%%i (
  5.        set /a n+=1
  6.        set "_!n!=%%i"&set .%%i=a
  7.   ))
  8.          set /a m=n-1
  9.          for /l %%i in (1,1,!m!) do (
  10.          set /a e=%%i+1
  11.          for /l %%j in (!e!,1,!n!) do (
  12.          if !_%%i! gtr !_%%j! set/a _%%j=!_%%i!,_%%i=!_%%j!
  13.         )
  14.      )
  15.     for /l %%i in (1,1,!n!) do (
  16.     if not defined a1 (set/a a1=_%%i,m=1)else (
  17.     set/a "an=a1+m-1"
  18.     if !an! equ !_%%i! (
  19.     if !m! equ 2 (set var=!var! !a1! !an!) else set var=!var! !an!
  20.   ) else set/a a1=_%%i,m=1
  21. )
  22. set /a m+=1
  23. )
  24. echo!var!
  25. pause
复制代码

[ 本帖最后由 terse 于 2009-10-2 13:23 编辑 ]

TOP

第二个不好 不满足 不能换数字的位置 只能删
第一个也一样不行
例如 改一下
set "str=1 2 55 3 4 5 6 7 8 10 9"
他的输出居然是
1 2 3 4 5 6 7 8 9 10
输入的10可是在9前面的.........还得再想想
o(∩_∩)o...~~~
空间:http://hi.baidu.com/fair_jm
喜欢批处理的没事的话去逛逛哦~~

TOP

不是说排序的吗?
结果出来就是排好序的啊
1

评分人数

TOP

是排序
但数字的位置不能变
只能删除其中的数字 让剩下的呈升序排列
我没说清楚 对不起了
o(∩_∩)o...~~~
空间:http://hi.baidu.com/fair_jm
喜欢批处理的没事的话去逛逛哦~~

TOP

1 2 55 3 4 5 56 7 8 9

1>.删去55 56后
1 2 3 4 5 7 8 9有序

2>.删去1 2 3 4 5 7 8 9 后
55 56 有序

3>.删去3 4 5 7 8 9后
1 2 55 56有序
……

这个规则不够严谨的话。。。

TOP

恩 ls说的对
所以这里只要求给出一种就可以了
即以第一个数为基准
o(∩_∩)o...~~~
空间:http://hi.baidu.com/fair_jm
喜欢批处理的没事的话去逛逛哦~~

TOP

可能是我理解不够
要是以第一个数为基准 那就直接在数组里找吧 排序也不要
让N + 1 递增 然后 标记
另数组 ”54 11 56 2 55 3 5 4 1 7 56 56 8 10“
最终结果是?

[ 本帖最后由 terse 于 2009-10-2 16:34 编辑 ]

TOP

54 56
其实题目可以加深 例如求删除最少的数 输出最长的
可惜我还没怎么想出来 哎
o(∩_∩)o...~~~
空间:http://hi.baidu.com/fair_jm
喜欢批处理的没事的话去逛逛哦~~

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (1 1 2 55 3 4 5 1 7 8 9 10) do (
  3. set ...%%i=0000%%i
  4. set /a ...count%%i+=1
  5. set ...!...%%i:~-4!=%%i=!...count%%i!
  6. set ...%%i=
  7. )
  8. for /f "tokens=1,2,* delims==" %%i in ('set ...') do (
  9. for /l %%x in (1,1,%%k) do set /p =%%j <nul)
复制代码
不知道高不高效.......

[ 本帖最后由 bhsx 于 2009-10-2 16:48 编辑 ]
1

评分人数

    • 基拉freedom: 一样误解我的意思了 而且即使是排序 代码也 ...PB + 5

TOP

传说中 题目变成最简单的了
只需找出就好了
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p a=输入一串数字
  4. set n=1
  5. for %%i in (%a%) do (
  6. set _!n!=%%i
  7. set /a n=!n!+1
  8. )
  9. set x=0
  10. set max=%_1%
  11. set /p=%max% <nul
  12. for /l %%i in (2 1 !n!-1) do (
  13. set /a "x=_%%i-max"
  14. if !x! gtr 0 set /p=!_%%i! <nul & set max= &set max=!_%%i!
  15. )
  16. pause
复制代码
其实原意是要向8L那样的 然后举出最长的数列....那个才是最难得 哎
o(∩_∩)o...~~~
空间:http://hi.baidu.com/fair_jm
喜欢批处理的没事的话去逛逛哦~~

TOP

输入 54 11 56 2 55 3 5 4 1 7 56 56 8 10
怎么结果:54  57
并不是你要的  54  56

TOP

上面代码输入1 2 55 3 4 5 1 7 8 9
结果是 1 2  55

[ 本帖最后由 bhsx 于 2009-10-2 17:44 编辑 ]

TOP

返回列表