返回列表 发帖
本帖最后由 zm900612 于 2011-5-16 21:16 编辑
set /a的问题不是在效率上
而是在逻辑上
因为你在set /a n+=%%a时并没有计算h
那么如果set /a n-=%%a在特定条件下没有运行一次
那么h的取值为空
或者set /a n-=%%a最后一次没有运行
那么h的取值会差1

set/p ...
qzwqzw 发表于 2011-5-16 20:11

这个确实没想到,没顾虑到特殊情况。

关于改进思路,汗一个,错了不止一处,应该改成:
endlocal
for /f "tokens=1* delims=:" %%a in ('sort /r /+%h% a.txt^|findstr /n .*^|findstr /b 1:') do set "long=%%b"
...COPY

TOP

怎么看怎么觉得这个修改后的代码仍然有问题
没有实测
就是觉得sort 既不用+%h% 也不用 /r
会将a.txt排序成什么样子
而第二个findstr 为什么还会用a.txt?
天的白色影子

TOP

32# qzwqzw


又忘了,已修改

TOP

本帖最后由 Hello123World 于 2011-7-20 14:33 编辑

模仿3楼的算法,手动写一个。
@echo off & Setlocal EnableDelayedExpansion
set n=0
::本以为变量不定义,用时值就自动是零,这里不定义n,后面就会出错。
For /f "delims=" %%i in (a.txt) do (
Set "a=%%i"
Set a1=!a: =!
Set str=0
Call :hello
)
echo %max%
pause
Goto :eof
:hello
If Not "!a1:~%str%,1!"=="" Set /a str+=1 & Goto hello
::此句用来计算字符串长度
If %str% gtr %n% Set n=%str%&Set max=%a%
Goto :eofCOPY
说到底,知识就是那些,关键还是看怎么用(算法)。

TOP

在循环中非常高效的表驱动法:
@echo off&setlocal enabledelayedexpansion
set "tmp= 0 9 8 7 6 5 4 3 2 1"
for /l %%a in (0 1 4) do set var=!tmp: =%%a!!var!
for /f "delims=" %%a in (a.txt) do (
set str=%%a
set m=!str: =!!str: =!!var!
if "1!m:~100,2!" gtr "1!max!" (
set max=!m:~100,2!
set text=%%a
)
)
echo !text!
pauseCOPY
同样的算法稍加改动,日后最多可以兼容四千多位:
@echo off&setlocal enabledelayedexpansion
for /l %%a in (1 1 5) do set a=!a!0987654321
for /l %%a in (0 1 4) do set b=%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a!b!
for /f "delims=" %%a in (a.txt) do (
set str=%%a
set m=!str: =!!a!
set n=!str: =!!b!
if "1!n:~50,1!!m:~50,1!" gtr "1!max!" (
set max=!n:~50,1!!m:~50,1!
set text=%%a
)
)
echo !text!
pauseCOPY

TOP

本帖最后由 zaixinxiangnian 于 2011-9-2 21:52 编辑

高手区啊,,,看了好久愣是没有看懂
set m=0
      call :1                  
)
echo %wang%
pause
goto :eof
:1
  if not "!ke1:~%m%,1!"=="" set /a m+=1&goto 1
  if %m% gtr %n% set n=%m%&set wang=%ke%
  goto :eofCOPY
哪位高手有时间给句句解释下  set m=0 是不是每次累加呀。。。。。

TOP

加点分呗
gawk "{str=$0;gsub(/ /,\"\",str);count=length(str);if(max<count){max=count;strOut=$0;}}END{print strOut}" test.txtCOPY
1

评分人数

TOP

@echo off&setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=:" %%a in ('findstr /n . a.txt') do (
    set str=%%b
    set str=!str: =!
    for /l %%c in (0,1,100) do (
        set str2=!str:~%%c,1!
        if not "!str2!"=="" set /a "#%%a+=1"&set "_%%a=%%b"
)
)
for /f "tokens=1,2 delims==" %%a in ('set #') do set num=!num! %%b
set num=!num:~1!
for /l %%a in (1,1,100) do (
    for %%b in (!num!) do (
if %%a==%%b set shuzi=%%b
)
)
for /f "tokens=1,2 delims==" %%a in ('set #') do (
set zimu=%%a
if %%b==!shuzi! set zimu=!zimu:~1!
)
call,echo;%%_!zimu!%%
pauseCOPY
代码有点多
心累~努力,为了美好的明天。

TOP

@echo off&setlocal enabledelayedexpansion
set w=0&set "e="
for /f "tokens=*" %%i in (a.txt) do (set q=%%i
  call :m !q: =!
  set/a r=w-l
if "!r:~0,1!"=="-" (set w=!l!&set e=%%i))
echo;%e%
pause&exit
:m
set m=%1&set l=0
for /l %%i in (0,1,1024) do (if "!m:~%%i,1!"=="" (set/a l=%%i-1&goto :eof))COPY
1

评分人数

TOP

"""
python3
找出字符数最多的行
2016年5月2日 03:56:13 codegay
"""
with open("a.txt") as f:
    kv={''.join(r.split()).__len__():r for r in f}
    print(kv[max(kv)])
            
            COPY
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

参考3楼代码,这样效率要高些:
@echo off
set firstline=true
set m=0
setlocal enabledelayedexpansion
for /f "delims=" %%a in (test2.txt) do (
    set "str1=%%a"
    set "str2=!str1: =!
    if "%firstline%"=="true" (
        set firstline=false
        call :o
    ) else (
        for %%b in ("!m!") do if not "!str2:~%%b!"=="" call :o
    )
)
echo %longestline%
echo %m%
pause
goto :eof
:o
if not "!str2:~%m%!"=="" set /a m+=1&set longestline=%str1%&goto :o
goto :eofCOPY

TOP

返回列表