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

协议软件 2013-09-15 01:18:12
求算术表达式中的某个变量值
写一个函数,参数是算术表达式字符串,返回值是表达式中的某个变量的值。
例如:
参数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;
}
...全文
357 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
独孤的根号3 2013-09-16
  • 打赏
  • 举报
回复
JAVA看的我蛋疼
54Cinderella 2013-09-16
  • 打赏
  • 举报
回复
新手表示看的好晕啊
薄荷葡萄 2013-09-16
  • 打赏
  • 举报
回复
这种东西在写之前最好先有个考虑比较好吧,一般面试的时候来写这种代码,很难把方方面面都考虑到吧。
协议软件 2013-09-15
  • 打赏
  • 举报
回复
嗯 基本上解决了 谢谢大家! 结贴了
threenewbee 2013-09-15
  • 打赏
  • 举报
回复
看回答的人蛮多,为了鼓励更多人踊跃参与,加到200分。 lz注意结贴
threenewbee 2013-09-15
  • 打赏
  • 举报
回复
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);
        }
    }
}
智商余额不足 2013-09-15
  • 打赏
  • 举报
回复
引用 11 楼 hwenycocodq520 的回复:
[quote=引用 9 楼 iamwangshao 的回复:] [quote=引用 8 楼 hwenycocodq520 的回复:]

.....
有bug: "6/?=2", "?=3*4",[/quote] 改这里. if (op2 == "?") return int.Parse(op1) * int.Parse(op3); ?=3*4 这种表达式没考虑,你写吧,[/quote] if (op2 == "?") return int.Parse(op1) / int.Parse(op3);
智商余额不足 2013-09-15
  • 打赏
  • 举报
回复
引用 9 楼 iamwangshao 的回复:
[quote=引用 8 楼 hwenycocodq520 的回复:]

.....
有bug: "6/?=2", "?=3*4",[/quote] 改这里. if (op2 == "?") return int.Parse(op1) * int.Parse(op3); ?=3*4 这种表达式没考虑,你写吧,
小托尼 2013-09-15
  • 打赏
  • 举报
回复
引用 8 楼 hwenycocodq520 的回复:

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;
        }
    }
}
有bug: "6/?=2", "?=3*4",
智商余额不足 2013-09-15
  • 打赏
  • 举报
回复

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;
        }
    }
}
小托尼 2013-09-15
  • 打赏
  • 举报
回复
小托尼 2013-09-15
  • 打赏
  • 举报
回复
下午无聊写了下,基本所有情况都考虑了,写得不好,各位批评指正
        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;
            }
        }
hudsonhuang 2013-09-15
  • 打赏
  • 举报
回复
首先,分隔开来 [num1] [op] [num2] = [num3] 然后,进行转换,把所有的问号放到后面 [num_n] [^op] [num_m] = ? 最后,计算前面就可以了
协议软件 2013-09-15
  • 打赏
  • 举报
回复
?-5=-4
协议软件 2013-09-15
  • 打赏
  • 举报
回复
负数的还是没有考虑 例如
threenewbee 2013-09-15
  • 打赏
  • 举报
回复
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);
        }
    }
}
程晨c 2013-09-15
  • 打赏
  • 举报
回复
面试的题目,从来不做。

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧