码迷,mamicode.com
首页 > 其他好文 > 详细

Problem 1000 to 1002

时间:2015-03-14 21:21:17      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

Problem 1000

问题: 输入两个正整数A,B,输出两个正整数之和A+B

using System;
//Input integer number A,B,output A+B.
    class Program
    {
        static void Main(string[] args)
        {
            string[] s = Console.ReadLine().Split();
            Console.WriteLine("{0}", Convert.ToInt16(s[0]) + Convert.ToInt16(s[1]));
        }
    }

主要知识点:强制类型转换(有很多种方式:http://blog.csdn.net/under_moon/article/details/4927423

Problem 1001

问题:输入一系列数(数的范围从0~10^18),这些数之间用空格及换行符等分隔。输出这些数的平方根(从最后一个数开始到第一个数),并将结果保留四位小数。

技术分享

实现代码:

using System;

namespace Q1001
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = Console.In.ReadToEnd().Trim();
            char[] divide={\r,\t, ,\n,\v};
            string[] s=str.Split(divide,StringSplitOptions.RemoveEmptyEntries);
            for(int i=s.Length-1;i>=0;i--)
                Console.WriteLine("{0:F4}",Math.Sqrt(Convert.ToDouble(s[i])));
            Console.ReadKey();
        }
    }
}

主要知识点:

  1. In.ReadToEnd(输入全部字符串,Ctrl+z---输入结束)
  2. String.Split(char[],StringSplitOptions):将字符串划分成一系列字符串https://msdn.microsoft.com/zh-cn/library/ms131448%28v=vs.110%29.aspx

采用正则表达式的方法:

using System;
using System.Text.RegularExpressions;

namespace Q1001
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] nums = Regex.Split(Console.In.ReadToEnd().Trim(),@"\s+");
            //等价于Regex reg=@"\s+";  reg.Split(Console.In.ReadToEnd.Trim());
            for (int i = nums.Length - 1; i >= 0; i--)
                Console.WriteLine("{0:F4}", Math.Sqrt(ulong.Parse(nums[i])));
            Console.ReadKey();
        }
    }
}
主要知识点:
  1. Regex.Split()的用法:https://msdn.microsoft.com/zh-cn/library/ze12yx1d%28v=vs.110%29.aspx
  2. 正则表达式一些符号含义:http://blog.163.com/l.h.s./blog/static/1040013202009110104348992/

Problem 1002

问题:Phone Numbers.  在手机键盘上九宫格输入模式下,每个方格里含有一个数字和几个字母(或者理解为一个数字对应几个字母),以下为一种对应关系:找出几个单词所对应的数字串组合起来恰好等于所给的数字串

技术分享

输入: 第一行输入一串数字(可以理解为电话号码),第二行输入需要输入的单词数,下面几行依次输入这几个单词。

输出:如果找到则显示这几个单词(之间用空格分隔),没找到则显示No solution.

不断执行上述过程,直到输入的一串数字为-1,停止。

技术分享

实现代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;

namespace Q1002_modify
{
    class Program
    {
        static void Main(string[] args)
        {
            Start(Console.In, Console.Out);
        }

        static void Start(TextReader reader,TextWriter writer)
        {
            while(true)
            {
                string phonenum = reader.ReadLine();
                if (phonenum == "-1")
                    break;
                int num=Int16.Parse(Console.ReadLine());
                string[] words=new string[num];
                string[] number=new string[num];
                for(int i=0;i<num;i++)
                {
                    words[i] = Console.ReadLine();
                    number[i] = WordToNum(words[i]);
                }
                int[] result = GetMatchIndex(phonenum, number);
                if (result != null)
                {
                    foreach (int a in result)
                        Console.Write("{0} ", words[a]);
                    Console.WriteLine();
                }
                else
                    Console.WriteLine("No solution.");
            }
        }

        //将字母转换为数字
        static string WordToNum(string word)
        {
            //使与字母相对应的数字恰好为数组的下标
            string[] phonenum = { "oqz", "ij", "abc", "def", "gh", "kl", "mn", "prs", "tuv", "wxy" };
            int[] num = new int[word.Length];
            int pos = 0;
            foreach (char s in word)  //将字母转换为数字
            {
                for (int i = 0; i < phonenum.Length; i++)
                {
                    if (phonenum[i].Contains(s))
                    {
                        num[pos] = i;
                        pos++;
                        break;
                    }
                }
            }
            //将数字变为字符串形式---后续所需
            string number = null;
            for (int i = 0; i < num.Length; i++)
                number+= num[i].ToString();
            return number;
        }
        //用于记录字符长度和起始位置
        struct Range
        {
            public int Length;
            public int First;
        }

        //检测单词对应的数字组合起来是否与号码相对应
        static int[] GetMatchIndex(string phonenum,string[] words)
        {   
            //记录字符串匹配开始位置
            bool[] match = new bool[phonenum.Length + 2];
            match[1] = true;
            Range[] list = new Range[match.Length];
            for (int i = 1; i < list.Length; i++)
                list[i].Length = phonenum.Length + 1;   
            for (int i = 1; i <= phonenum.Length; i++)  //从phonenum初始端一直往下寻找
            {
                if (!match[i])  //确定开始首字母位置
                    continue;       
                for (int j = 0; j < words.Length; j++)  
                {
                    int n = words[j].Length;
                    //当单词长度超过剩余匹配长度及该字符串非此号码的子字符串时直接跳出该次循环
                    if (phonenum.Length - i + 1 < n || words[j] != phonenum.Substring(i - 1, n))
                        continue;
                    match[i + n] = true; //指定下一个开始的位置
                    if (list[i + n - 1].Length <= list[i - 1].Length + 1)
                        continue;
                    list[i + n - 1].Length = list[i - 1].Length + 1; //记录单词个数
                    list[i + n - 1].First = j; //标明了符合的子字符串在phonenum中的位置
                }
            }
            int k = phonenum.Length;
            if (list[k].Length > k)
                return null;
            int[] idxs = new int[list[k].Length];
            for (int i = idxs.Length - 1; i >= 0; k -= words[idxs[i]].Length, i--)
                idxs[i] = list[k].First;
            return idxs;
        }
    }
}

主要知识点:

  1. 动态规划问题(空间来代替一部分时间),在此题中很巧妙的运用了 bool[] match这语句来记录匹配的起始位置。---动态规划详见:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741374.html
  2. 字符转换为数字部分: 既可以如上 static string WordToNum(string word)也可以 利用字典如下:
string WordToNumber(string word)
        {
            char[] number = new char[word.Length];
            for (int i = 0; i < word.Length; i++) 
                number[i] = TheDictionary[word[i]];
            return new string(number);
        }

        Dictionary<char, char> theDictionary = null;

        Dictionary<char, char> TheDictionary
        {
            get
            {
                if (theDictionary == null)
                {
                    theDictionary = new Dictionary<char, char>();
                    for (int i = 0; i < 26; i++)
                        theDictionary.Add((char)(a + i), "22233344115566070778889990"[i]);
                }
                return theDictionary;
            }
        }

此问内容很大程度上来自此博客http://www.cnblogs.com/skyivben/archive/2008/12/09/1351119.html

Problem 1000 to 1002

标签:

原文地址:http://www.cnblogs.com/Paul-chen/p/4338131.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!