首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求算术表达式中的某个变量值? (今日去某公司的面试题目)

2013-09-16 
求算术表达式中的某个变量值? (今天去某公司的面试题目)求算术表达式中的某个变量值写一个函数,参数是算术

求算术表达式中的某个变量值? (今天去某公司的面试题目)
求算术表达式中的某个变量值
写一个函数,参数是算术表达式字符串,返回值是表达式中的某个变量的值。
例如:
参数str="3*6=?",返回"?=18"。
参数str="6+?=10",返回"?=4"。
参数str="4-5=?",返回"?=-1"。
参数str="?-5=-4",返回"?=1"。
说明:三个变量(int类型)的运算(加、减、乘),已知两个变量,求第三个变量;


这个是今天上午去某公司面试的题目,想了好长时间,还是不会写这个函数。

        private string getresult(string str)
        {
            string result = "";
                 ......
           
            return result;
        }
[解决办法]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "5*10=?";
            string[] nums = s.Split('+', '-', '*', '/', '=');
            int xpos = nums.ToList().FindIndex(x => x == "?");
            string op = Regex.Match(s, @"[+\-*\/]").Value;
            Dictionary<string, Func<int, int, int>> dict1 = new Dictionary<string, Func<int, int, int>>()
            {
                { "+", new Func<int, int, int>((x, y) => x + y) },


                { "-", new Func<int, int, int>((x, y) => x - y) },
                { "*", new Func<int, int, int>((x, y) => x * y) },
                { "/", new Func<int, int, int>((x, y) => x / y) }
            };
            Dictionary<string, Func<int, int, int>> dict2 = new Dictionary<string, Func<int, int, int>>();
            dict2.Add("+", dict1["-"]);
            dict2.Add("-", dict1["+"]);
            dict2.Add("*", dict1["/"]);
            dict2.Add("/", dict1["*"]);
            nums = nums.Where(x => x != "?").ToArray();
            int result = (xpos == 0 
[解决办法]
 xpos == 1) ?
                dict2[op](int.Parse(nums[1]), int.Parse(nums[0])) :
                dict1[op](int.Parse(nums[0]), int.Parse(nums[1]));
            Console.WriteLine(result);
        }
    }
}


[解决办法]
首先,分隔开来   [num1] [op] [num2] = [num3]
然后,进行转换,把所有的问号放到后面  [num_n] [^op] [num_m] = ?
最后,计算前面就可以了


[解决办法]
下午无聊写了下,基本所有情况都考虑了,写得不好,各位批评指正
        static String GetResult(String input)
        {
            String result = "?=";


            List<String> ops = new List<string> { "+", "-", "*", "/" };
            String[] sides = input.Split('=');

            if (sides.ToList().Contains("?") 
[解决办法]
 sides.ToList().Contains("-?"))
            {
                String oneSide = sides.ToList().Where(e => !e.Contains("?")).ElementAt(0);
                char op = FindOp(oneSide);
                String[] num = oneSide.Split(op);
                result += input.Contains("-?") ? (-1 * Op(num, op)).ToString() : Op(num, op).ToString();
            }
            else
            {
                String newInput = Exchange(input);
                result = GetResult(newInput);
            }

            return result;
        }

        static String Exchange(String input)
        {
            String AfterExchanging = "";
            String[] sides = input.Split('=');
            String oneSide = sides.ToList().Where(e => e.Contains("?")).ElementAt(0);
            String anotherSide = sides.ToList().Where(e => !e.Contains("?")).ElementAt(0);
            char op = FindOp(oneSide);


            String[] parts = oneSide.Split(op);

            if (oneSide.StartsWith("?") 
[解决办法]
 oneSide.StartsWith("-?"))
            {
                AfterExchanging = parts[0] + "=" + anotherSide + DeOp(op) + parts[1];
                return AfterExchanging;
            }
            else if (oneSide.Contains("/") 
[解决办法]
 op == '-')
            {
                AfterExchanging = parts[0] + op.ToString() + anotherSide + "=" + parts[1];
                return AfterExchanging;
            }
            else if (op == '*')
            {
                AfterExchanging = anotherSide + DeOp(op) + parts[0] + "=" + parts[1];
                return AfterExchanging;
            }
            else
            {
                AfterExchanging = parts[0] + DeOp(op) + anotherSide + "=-" + parts[1];
                return AfterExchanging;
            }
        }

        static int Op(String[] num, char op)


        {
            int result = 0;

            switch (op)
            {
                case '+': result = int.Parse(num[0]) + int.Parse(num[1]); break;
                case '-': result = int.Parse(num[0]) - int.Parse(num[1]); break;
                case '*': result = int.Parse(num[0]) * int.Parse(num[1]); break;
                case '/': result = int.Parse(num[0]) / int.Parse(num[1]); break;
                default: break;
            }

            return result;
        }

        static String DeOp(char op)
        {
            String result = "";

            switch (op)
            {
                case '+': result = "-"; break;
                case '-': result = "+"; break;
                case '*': result = "/"; break;
                case '/': result = "*"; break;
                default: break;
            }

            return result;
        }

        static char FindOp(String s)


        {
            char op;
            if (s.Contains("*"))
            {
                op = '*';
                return op;
            }
            else if (s.Contains("/"))
            {
                op = '/';
                return op;
            }
            else if (s.StartsWith("-"))
            {
                op = s.ToList<char>().Where(n => (n < '0' 
[解决办法]
 n > '9') && n != '?').ElementAt(1);
                return op;
            }
            else
            {
                op = s.ToList<char>().Where(n => (n < '0' 
[解决办法]
 n > '9') && n != '?').ElementAt(0);
                return op;
            }
        }


[解决办法]
求算术表达式中的某个变量值? (今日去某公司的面试题目)
[解决办法]

namespace Demo
{
    class Program


    {
        static void Main(string[] args)
        {
            string[] test =
            {
               "3*6=?",
               "6+?=10",
               "4-5=?",
               "?-5=-4"
            };
            foreach (string expression in test)
            {
                Console.Write(expression + "\t");
                Console.WriteLine("?=" + ParseExpression(expression));
            }
            Console.ReadLine();
        }

        static int ParseExpression(string expression)
        {
            Dictionary<string, ICalculate> exps =new Dictionary<string, ICalculate>();
            exps.Add("+", new Add());
            exps.Add("-", new Sub());
            exps.Add("*", new Mul());
            exps.Add("/", new Div());
            var vars = expression.Split(new char[] { '+', '-', '/', '*','='}).Where(a => a != "").ToArray();
            string op = Regex.Match(expression, @"[+\-*\/]").Value;
            return exps[op].Cal(vars[0], vars[1], expression.Split('=').Last());
        }


    }


    public interface ICalculate
    {
        int Cal(string op1, string op2, string op3);
    }
    public class Add : ICalculate
    {
        public int Cal(string op1, string op2, string op3)
        {
            if (op1 == "?")
                return int.Parse(op3) - int.Parse(op2);
            if (op2 == "?")
                return int.Parse(op3) - int.Parse(op1);
            if (op3 == "?")
                return int.Parse(op1) + int.Parse(op2);
            return 0;
        }
    }
    public class Sub : ICalculate
    {
        public int Cal(string op1, string op2, string op3)
        {
            if (op1 == "?")
                return int.Parse(op3) + int.Parse(op2);
            if (op2 == "?")
                return int.Parse(op3) + int.Parse(op1);
            if (op3 == "?")
                return int.Parse(op1) - int.Parse(op2);
            return 0;
        }
    }
    public class Mul : ICalculate
    {
        public int Cal(string op1, string op2, string op3)


        {
            if (op1 == "?")
                return int.Parse(op3) / int.Parse(op2);
            if (op2 == "?")
                return int.Parse(op3) / int.Parse(op1);
            if (op3 == "?")
                return int.Parse(op1) * int.Parse(op2);
            return 0;
        }
    }
    public class Div : ICalculate
    {
        public int Cal(string op1, string op2, string op3)
        {
            if (op1 == "?")
                return int.Parse(op3) * int.Parse(op2);
            if (op2 == "?")
                return int.Parse(op3) * int.Parse(op1);
            if (op3 == "?")
                return int.Parse(op1) / int.Parse(op2);
            return 0;
        }
    }
}


[解决办法]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "6/?=2";


            string[] nums = Regex.Split(s, @"(?<=[^+\-*\/=]+)[+\-*\/\=]").ToArray();
            int xpos = nums.ToList().FindIndex(x => x == "?");
            string op = Regex.Match(s, @"(?<=[\d\?])[+\-*\/](?=[\d\?])").Value;
            var calcList = new List<Dictionary<string, Func<int, int, int>>>()
            {
                new Dictionary<string, Func<int, int, int>>()
                {
                    { "+", new Func<int, int, int>((y, z) => z - y) },
                    { "-", new Func<int, int, int>((y, z) => z + y) },
                    { "*", new Func<int, int, int>((y, z) => z / y) },
                    { "/", new Func<int, int, int>((y, z) => z * y) }
                },
                new Dictionary<string, Func<int, int, int>>()
                {
                    { "+", new Func<int, int, int>((x, z) => z - x) },
                    { "-", new Func<int, int, int>((x, z) => x - z) },
                    { "*", new Func<int, int, int>((x, z) => z / x) },


                    { "/", new Func<int, int, int>((x, z) => x / z) }
                },
                new Dictionary<string, Func<int, int, int>>()
                {
                    { "+", new Func<int, int, int>((x, y) => x + y) },
                    { "-", new Func<int, int, int>((x, y) => x - y) },
                    { "*", new Func<int, int, int>((x, y) => x * y) },
                    { "/", new Func<int, int, int>((x, y) => x / y) }
                }
            };
            nums = nums.Where(x => x != "?").ToArray();
            int result = calcList[xpos][op](int.Parse(nums[0]), int.Parse(nums[1]));
            Console.WriteLine(result);
        }
    }
}

热点排行