找回密码
 加入
搜索
楼主: pusofalse

[效率算法] 练习001 - 计算字符串长度

 火... [复制链接]
发表于 2009-12-23 15:47:22 | 显示全部楼层
哎,丢人了,貌似26# amu的就是这个方法,算了,没震住人...
发表于 2009-12-23 15:54:36 | 显示全部楼层
本帖最后由 sanmoking 于 2009-12-23 15:56 编辑
回复  sanmoking


    $a = "sanmoking使用纯AU3编写,禁止调用其他语言(如VBS、JAVA等)。加分:视思 ...
afan 发表于 2009-12-23 15:44



简单哈哈,,
$a = "sanmoking使用纯AU3编写,禁止调用其sanmoking1001他语言(如VBS、JAVA等)。加分:视思路加分,10-60分不等。"
$b = "sanmoking"
While 1
if StringInStr ($a,$b) > 0 Then
        $b = $b&Random(0,9,1)
Else
        ExitLoop
EndIf
WEnd        
$ok = StringInStr ($a&$b,$b)-1
MsgBox(0,"结果","StringLen 的结果:"&StringLen ($a)&@CRLF&"我的结果:"&$ok)

评分

参与人数 1金钱 +50 收起 理由
pusofalse + 50 学习了!

查看全部评分

发表于 2009-12-23 16:46:57 | 显示全部楼层
回复 32# sanmoking


    高手就是难不倒...
发表于 2009-12-27 18:57:27 | 显示全部楼层
;主流的都让你们用了,我来2个非主流的.只是另类不做实际使用.

$str="; Script Start - Add我是中文 your code below here测试"
;方法1 中文被识别为2个长度
#include <Constants.au3>
$foo = Run("sort.exe", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
$n=StdinWrite($foo, $str)
MsgBox(0,"",$n)
;方法1结束

;方法2  中文和英文同为1个长度
TCPStartUp()
$ConnectedSocket = TCPConnect("61.187.251.222", 80);IP为www.autoitx.com
$n=TCPSend($ConnectedSocket, $str)
TCPShutdown ()
MsgBox(0,"",$n)
;如此判断字符串长度,肯定是前无古人,后无来者.

评分

参与人数 1金钱 +45 收起 理由
pusofalse + 45 学习了!

查看全部评分

发表于 2010-2-26 23:17:26 | 显示全部楼层
学到的不仅仅是代码。
发表于 2010-2-27 15:55:01 | 显示全部楼层
回复 15# afan


    表驱动法简单来说就是把原来须要用类似 switch-case 之类语句来做的事用表的对应关系来做。它是初学者必备的武器。这么说太抽象,看个例子。它是一个根据学生的成绩来说出等级的类:
    class Calc
    {
        private static double[] rangeLimit = { 50.0, 65.0, 75.0, 90.0, 100.0 };
        private static string[] grade = { "F", "D", "C", "B", "A" };
        private static readonly int maxLevel = grade.Length - 1;

        public static string CalculateGrade(double score)
        {
            int level = 0;
            while (level <= maxLevel)
            {
                if (score < rangeLimit[level]) return grade[level];
                else level++;
            }
            return grade[maxLevel];
        }
    }如果你的成绩是 89,那么你的等级应该是 B。上面例子很好懂。但是要注意边界的问题。这是个做范围判断的例子。下面是一个一一对应的例子。这个类会把一个十进制的正整数转换成它的十六进制表示:

     class Calc
    {
        private static string[] hexChars = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" };

        private static string ConvertToHexFormat(uint digits)
        {
            Stack<string> stack = new Stack<string>();

            uint tmp;
            do
            {
                tmp = digits & 0xF;
                stack.Push(hexChars[tmp]);
                digits = digits >> 4;
            }
            while (digits != 0);

            StringBuilder sb = new StringBuilder();
            while (stack.Count > 0)
            {
                sb.Append(stack.Pop());
            }

            return sb.ToString();
        }

        public static string Convert(uint digits)
        {
            return ConvertToHexFormat(digits);
        }

        public static string Convert(string digits)
        {
            uint tmp = uint.Parse(digits);
            return ConvertToHexFormat(tmp);
        }
}

怎么样?很爽吧。核心的代码不过 3 句而已!

表驱动法可以让你省去一大堆令人头晕的条件判断语句,让代码看起来更优雅。本文只是让你对它有一个直观的印象,并不包含它全面的知识。它还包括定义索引等其它的东西。比如说,上面的等级评定的示例中,负责查找等级的循环明显是程序的主要消耗所在。你可以考虑用二分法之类的方法来节省时间。如果表中包含的元素数十分巨大怎么办?定义个索引。

最后给一个把 byte[] 转换成它对应的十六进制表示的例子。以前 CSDN 上有人问过,说为什么我用 framework 里的 MD5ServiceProvider 提供的方法来计算,得到的结果不唯一?答案是你的结果没有转换成它的等价的字符串表示。下面是 MSDN 上的方法,有了它,你再用 MD5ServiceProvider 就不会有问题了:
  class HexTest
{
    static char[] hexDigits = {
        '0', '1', '2', '3', '4', '5', '6', '7',
        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

    public static string ToHexString(byte[] bytes) {
        char[] chars = new char[bytes.Length * 2];
        for (int i = 0; i < bytes.Length; i++) {
            int b = bytes;
            chars[i * 2] = hexDigits[b >> 4];
            chars[i * 2 + 1] = hexDigits[b & 0xF];
        }
        return new string(chars);
    }

    static void Main() {

        byte[] b = {0x00, 0x12, 0x34, 0x56, 0xAA, 0x55, 0xFF};
        Console.WriteLine(ToHexString(b));
    }
}

百度找的。
发表于 2010-2-27 15:56:35 | 显示全部楼层
表驱动法 说白了就是创建表与事件的对应关系。 当出现一个事件。就可以在表中找出相应的数据。 直接读出该数据就是要的结果。
类似于查立方表或者是平方表的方法。
发表于 2010-3-8 18:05:00 | 显示全部楼层
完全不懂。什么叫表驱动法。。 汗。 还是一个菜鸟啊。~~!
发表于 2010-7-6 01:21:54 | 显示全部楼层
我也来凑热闹:
UBound(StringToASCIIArray("d你sfds"))

评分

参与人数 1金钱 +50 收起 理由
pusofalse + 50 学习了~

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-15 16:45 , Processed in 0.072488 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表