返回列表 发帖

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

偶尔看到这一个问题
例子:
1 2 55 3 4 5 1 7 8 9
然后结果是
删去 55 1
或者直接给出排列好的数列 1 2 3 4 5 7 8 9COPY
如果用数直接比对以前的数 那效率一定很低 这里求代码的简约 高效
大家有什么好的方案
注:
数字不能换位子
例如 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

前面排序都一样 后面判断稍不同
@echo off&setlocal enabledelayedexpansion
set "str=1 2 55 3 4 5 1 7 8 9"
for %%i in (!str!) do (
    if not defined .%%i (
       set /a n+=1
       set "_!n!=%%i"&set .%%i=a
  ))
         set /a m=n-1
         for /l %%i in (1,1,!m!) do (
         set /a e=%%i+1
         for /l %%j in (!e!,1,!n!) do (
         if !_%%i! gtr !_%%j! set/a _%%j=!_%%i!,_%%i=!_%%j!
        )
     )
    for /l %%i in (1,1,!n!) do (
    if !s1! equ !_%%i! (
    set/a s1-=1
    if defined ..!s1! (set var=!var! !_%%i!)else set var=!var! !s1! !_%%i!
    set ..!_%%i!=.
   )
    set/a s1=_%%i+1
)
echo!var!
pauseCOPY
@echo off&setlocal enabledelayedexpansion
set "str=2 2 12 3 4 5 11 7 8 9"
for %%i in (!str!) do (
    if not defined .%%i (
       set /a n+=1
       set "_!n!=%%i"&set .%%i=a
  ))
         set /a m=n-1
         for /l %%i in (1,1,!m!) do (
         set /a e=%%i+1
         for /l %%j in (!e!,1,!n!) do (
         if !_%%i! gtr !_%%j! set/a _%%j=!_%%i!,_%%i=!_%%j!
        )
     )
    for /l %%i in (1,1,!n!) do (
    if not defined a1 (set/a a1=_%%i,m=1)else (
    set/a "an=a1+m-1"
    if !an! equ !_%%i! (
    if !m! equ 2 (set var=!var! !a1! !an!) else set var=!var! !an!
  ) else set/a a1=_%%i,m=1
)
set /a m+=1
)
echo!var!
pauseCOPY

[ 本帖最后由 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

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

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

评分人数

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

TOP

传说中 题目变成最简单的了
只需找出就好了
@echo off
setlocal enabledelayedexpansion
set /p a=输入一串数字
set n=1
for %%i in (%a%) do (
set _!n!=%%i
set /a n=!n!+1
)
set x=0
set max=%_1%
set /p=%max% <nul
for /l %%i in (2 1 !n!-1) do (
set /a "x=_%%i-max"
if !x! gtr 0 set /p=!_%%i! <nul & set max= &set max=!_%%i!
)
pauseCOPY
其实原意是要向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

返回列表