我要编程

    华为编程比赛,我顺利落榜,经过短暂的失落感之后,我很快又回来coding世界了!请收了我吧,请允许我一步一步走下去,请理解我初期的蜗牛似的行进脚步,我会创造越来越靠谱的正值加速度的。
    河畔水人很多,牛人也不少,但这不是我泡汤的理由,主要还是自己真心太水了。3个题摆在我面前,不要说两个钟头coding三个,就是只把第二个拿来我c,两个钟头也未必能办妥,所以。。。哈哈,华为GG,这一次你刷掉我,是对的,但我决定:努力不给你第二次刷我的机会,哟。

    刚刚不是说到第二题嘛,虽然说出来有点更加衬托我的暴弱,但我还是说吧,立刻开始。


    1.  [自动完成]输入字符串,然后在单词本中查找有木有与输入字符串匹配的单词,若有,则输出匹配的单词到输出数组;单词本中的单词以空格相隔。
    例如:单词本中的单词集为"chengdu chongqing huanghe changjiang",我输入"ch",则应输出"chengdu chongqing changjiang"......
    函数原型:
void auto_complete(char *dict,char *input,char output[])
    函数定义:
/************************************************************
*  Name: auto_complete
*  Copyright: @ee
*  Author: 辰采星 
*  Date: 2012-04-25
*  Description: 为了卖关子,就不了,并且cut掉注释哦

*************************************************************/

void auto_complete(char *dict,char *input,char output[])
 {
      if(NULL == dict || NULL == input || NULL == output)
      {
           printf("Invalid arguments!\n");
           getchar();
           exit(1);
      }
      char *p = output;
      int k = 0;
      int j = 0;
      int i = 0;
      while(*(dict + i) != '\0')
      {
           while(' ' == *(dict + i))
           ++i;
           while(*(input + j) != '\0' && *(dict + i) != '\0')
           {
               if(*(dict + i) == *(input + j))
               {
                   ++i;
                   ++j;
               }
               else
                   break;
      }
 
      if('\0' == *(input + j) && (0 == (i - j) || ' ' == *(dict + i - j - 1)))
      {
           for(k = i - j;*(dict + k) != ' ';++p,++k)
               *p = *(dict + k);
           *(p++) = ' ';
            j = 0;
      }
      else
      {
           j = 0;
      }
      ++i;
      }
      *p = '\0';
 }


    coding & testing后感:
    修正思路的错误就花了哥哥几百滴汗水啊!然后仍然百调不得其解,今天走在去食堂的途中,才有一道灵光打在我的脑袋上,妈呀,是不是。。。?回宿舍一改。。。最后知道真相的我眼泪掉下来。。。尼玛,果然是你啊——'\0',冷落了你这么久,太对不住了,请原谅我吧,看在我也受了时间之罚的情分上。
    当然,这个函数依赖于C风格的字符串,这是不妥之一。应该还有之二、之三。。。等等吧,等我线下寻找。

    2.  《编程之美》上有这么一道小题,给定一个主串s1,拿一个模式串s2来,看s2能否在s1中通过循环移位来找到匹配的字串,能则返回true,否则返回false。

    例如:s1 = "AABECD",s2 = "CDAA",应该返回true;而如果s2 = "BED",则要返回false了。
    函数原型:
_Bool rot_match(char *dict,char *input)
    函数定义:
/*******************************************************************
*  Name: RotateMatch
*  Copyright: @ee
*  Author: 辰采星 
*  Date: 2012-04-23
*  Description: 也cut掉注释哦,我再想想我的逻辑对了没有呢 
********************************************************************/

_Bool rot_match(char *dict,char *input)
 {
     int len_in = strlen(input);
     int len_dict = strlen(dict);
     int len_tmp = 2 * len_dict;
     int i = 0;
     int j = 0;
     while(i < len_tmp)
     {
         if(*(dict + i % len_dict) == *(input + j))
         {
             ++i;
             ++j;
         }
         else
             ++i;
     }
     if(len_in == j)
         return true;
     else
         return false;
 }

    字符串真是不容易操控啊!
******************************************************************************************************
Review @ 2012-04-27 :
    auto_complete()函数作了多余的比较,因为是单词左端匹配查询得嘛,比如,一旦首字母失配,就应该直接比较下一个单词,而不是上述代码里所做的:继续比较,之后再来判断有木有失配。当然,我觉得这个字典结构本身不完美,要是组织成指针数组,就漂亮点了。

Review @ 2012-04-30 :
    C99之前的C标准没有布尔类型。
******************************************************************************************************

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; class RegexTest { public static void main(String[] args) { checkMail(); StringReplace(); ipSort(); getNumber(); } /* * 需求: 对邮件地址进行校验,判断给出的mail是否是合法的邮箱地址 */ public static void checkMail() { String mail = "abc12@sina.com"; String mailRegex = "[a-zA-Z0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+"; Pattern pattern = Pattern.compile(mailRegex); Matcher matcher = pattern.matcher(mail); if (matcher.matches()) { System.out.println(mail + " is a valid email address."); } else { System.out.println(mail + " is not a valid email address."); } } /* * 需求: 将下列字符串转成:我要编程 */ public static void StringReplace() { String str = "我我...我我..我...我要..要要..学学学学...学学..编...编程程"; String replaceStr = str.replaceAll("[^我要编程]", ""); System.out.println(replaceStr); } /* * 192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30 将ip地址进行地址段的顺序排序 * 还按照字符串自然顺序,只要让它们每一段都是3位即可 1,按照每一段需要的最多的0进行补齐 那么每一段就会至少保证有3位 2,将每一段只保留3位 这样,所有的ip地址都是每一段3位 */ public static void ipSort() { String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30"; TreeSet<String> set = new TreeSet<String>(); String[] ips = ip.split(" "); for (String s : ips) { String[] nums = s.split("\\."); StringBuilder sb = new StringBuilder(); for (String num : nums) { sb.append(String.format("%03d", Integer.parseInt(num))); } set.add(sb.toString()); } for (String s : set) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.length(); i += 3) { sb.append(Integer.parseInt(s.substring(i, i + 3))).append("."); } sb.deleteCharAt(sb.length() - 1); System.out.println(sb.toString()); } } /* * 提取数字 */ public static void getNumber() { String string = "12334我的QQ是: 456456 我的电话是:0532214我的邮箱是:123:aaa@aaa.com"; String regex = "\\d+"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(string); while (matcher.find()) { System.out.println(matcher.group()); } } }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值