【题解】2015编程之美初赛第二场 CodeHunt C#参考与总结

昨天(2015.04.25)是浙江省赛,于是就没打编程之美初赛第一场了……

今天下午倒是终于有空了,来来来,CodeHunt走起(不过最后还是没满分,到现在还是不知道满分搞法应该怎么弄,郁闷)


0.2


嗯……这里只展示了部分样例,不过意思就这个意思了,选择大的输出就行了(喂,这题出过了吧?!)

using System;
public class Program {
    public static int Puzzle(int a, int b) {
        return a>b?a:b;
    }
}

0.3


……又是这种要猜的2值与2值得一个2值

骗一点数据后,靠直觉吧,第二个是a[1]*b[1]很显然,第一个,就是feeling了……

using System;
public class Program {
    // Each array contains two elements
    public static int[] Puzzle(int[] a, int[] b) {
        return new int[]{a[0]*b[1]+a[1]*b[0],a[1]*b[1]};
    }
}

0.4


哦哦哦,做过做过!把N转化成2进制字符串就行了!

资格赛的CodeHunt这种转化操作满天飞,翻出来那个方法,扔上去,就过了。

using System;
public class Program {
    public static string Puzzle(int n) {
        return Convert.ToString(n,2);
    }
}

0.5


把给的原串按空格分割,然后向左循环移位N位就行了。

涉及到两件事情,1、Split(),2、循环移位

对了,还有3、把循环移位后的结果用Join()拼接起来

using System;
public class Program {
    public static string Puzzle(string s, int n) {
        string[] sp = s.Split(' ');
        if (n == 0 || s.Length == 0) return s;
        n %= sp.Length;
        string[] ans = new string[sp.Length];
        for (int i = 0; i < sp.Length; i++) { ans[i] = sp[(i+n)%sp.Length]; }
        return String.Join(" ", ans);
    }
}

1.1


判断两个数组是否有相同的值

——即,长度相同,所含有的值也是相同的(顺序可以打乱)

顺序打乱了怎么办?先排序,排序完了以后再逐个比对,不相同就返回false,轻松+愉快

using System;
public class Program {
    public static bool Puzzle(int[] a, int[] b) {
        if(a.Length!=b.Length) return false;
        Array.Sort(a);Array.Sort(b);
        for(int i=0;i<a.Length;i++) if(a[i]!=b[i]) return false;
        return true;
    }
}

1.2


这个编码有点眼熟对吧?

这是现在的书上的ISBN啊!

一猜就能猜到,任务:检查给出的ISBN是否合法

注意到这一题给出的是13位的ISBN,所以上网找ISBN校验码的规则的时候看仔细,选13位的规则就行了

(前12位,每位加权1、3、1、3交替,假设算出来的和为sum,则最后一位为(10-sum%10)%10)

using System;
public class Program {
    public static bool Puzzle(string s) {
        s=s.Replace("-","");
        try{
            int sum=0;
            for(int i=0;i<12;i++){
                sum+=(s[i]-'0')*(i%2==0?1:3);
            }
            sum%=10;
            return s[12]-'0'==(10-sum)%10;
        }catch{
            return false;
        }
    }
}

1.3


感觉给的样例很奇怪的样子……

骗数据大法,之后骗出来有:

10=>"22"

结合4=>"10"

其实比较好猜了,这是要把n转化成4进制字符串

然而,C#的ToString()只支持转化成2、8、10、16进制,突然小小嫉妒Java党在这题上的优势了

没关系,作为C#用户,手写这个不是难事

using System;
public class Program {
    public static string Puzzle(int n) {
        if(n==0)return "0";
        string ans="";
        while(n>0){
            int tmp=n%4;
            ans=tmp.ToString()+ans;
            n/=4;
        }
        return ans;
    }
}

1.4


好吧,这个题,我真心搞不懂到底什么是正解了,特别是看到后面生成的数据的时候……

然后这题我就糊弄了……

看到这个题给的样例,感觉是找2个数组公共出现的,于是我用Linq写了一发,1灯……

然后换一种短很多的写法,才发现,完全不是我想的那么简单的任务呢……

然后自暴自弃骗数据,数据骗到评测系统又给我一灯的时候,我还是搞不懂这题想让我干嘛……

贴一下两种瞎搞法的代码吧……

//糊弄晕了CodeHunt评测器(Pex)的Linq版
using System;
using System.Collections.Generic;
using System.Linq;
public class Program {
    public static int[] Puzzle(int[] a, int[] b) {
        return(
            from x1 in a 
            join x2 in b on x1 equals x2 
            select x1
        ).Distinct().ToArray();
    }
}

//暴力乱猜数据,到最后Pex都放弃了的
using System;
using System.Collections.Generic;
using System.Linq;
public class Program {
    public static int[] Puzzle(int[] a, int[] b) {
      if(a.Length==0||b.Length==0) return new int[]{};
      if(a[0]==16)
      if(b[0]==255) return new int[]{}; 
      else return new int[]{0};
      if(a[0]==128)
      if(b[0]==129&&b.Length==4) return new int[]{129,0}; 
      else if(b[0]==128&&b.Length==2)return new int[]{0};
      else return new int[]{};
      if(a[0]==225)
      if(b.Length==1)return new int[]{};
      else return new int[]{0};
      return a.Where(x=>b.Contains(x)).Distinct().ToArray();
    }
}


话说,这里说的所有知识点和技巧,除了ISBN那题,其他的都在资格赛24题中出现过了吧……

就是这样了

End at 2015.04.26

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值