【问题标题】:tricky interview question in CC中棘手的面试问题
【发布时间】:2011-03-23 04:59:35
【问题描述】:

在下面的面试问题中:

给定一个数字 n,给我数字 (在3..5和偶数个 数字),其加法将返回 原号码。结果数字 应尽可能平衡, 这意味着不是返回35,例如,返回44。例如:

7 = 3 + 4
16 = 4 + 4 + 4 + 4 rather than 3 + 5 + 4 + 4
24 = 12 + 12 or 6 + 6 + 6 + 6

我想到了以下方法:

splitnumber(int n)
{
    //check if the number is even
    if(n%2==0)
    {
        print(n/2,n/2);
        //check if x=2^m multiple exists or
        // not..like 4,8,16 etc
        print (n/x...n/x);
    }
    else //else if the no is odd... this part is incomplete
    {
        if(n-3>0)
        {
            print (3);

        }

        n-=3;
        if(n>0)
        {
            if (n>5)
            {
                print(3)
                n-=3;
            }
        }
    }
}

但我仍然无法完成所有案例......我应该如何检查答案何时有不平衡的解决方案??

【问题讨论】:

  • 多么烦人的面试问题。
  • 如果工作是 html 开发人员,则可以加分。
  • 为什么24被分解成6 + 6 + 6 + 6,而不是4 + 4 + 4 + 4 + 4 + 4
  • 你可以有偶数......是的 4 + 4 + 4 + 4 + 4 + 4 也是一个答案
  • 如果你可以使用任何整数,3..5 是什么意思?

标签: c puzzle


【解决方案1】:
if (n < 4) print n;
else
    switch (n % 4)
        case 0: *print n/4 4's*
        case 1: *print n/4 - 1 4's* print 5
        case 2: *print n/4 - 1 4's* print 3 print 3
        case 3: *print n/4 4's* print 3

在 C# 中实现效率略低

if (n < 4) Console.WriteLine(n);
else
    switch (n % 4)
    {
        case 0:
            Console.WriteLine(String.Join(" ", new string('4', n / 4).ToArray()));
            break;
        case 1:
            Console.WriteLine(
                (String.Join(" ", new string('4', n/4).ToArray().Skip(1)) + 
                " 5").TrimStart());
            break;
        case 2:
            Console.WriteLine(
                (String.Join(" ", new string('4', n/4).ToArray().Skip(1)) + 
                " 3 3").TrimStart());
            break;
        case 3:
            Console.WriteLine(String.Join(" ", new string('4', n/4).ToArray() + 
                " 3"));
            break;

    }

【讨论】:

  • 解决方案不是必须打印偶数个数字吗?如果n = 11 打印4 4 3
  • @srgerg 没有注意到那个注释。
  • 只有数字 3,4 和 5 以及偶数个数字的 11 没有解。
  • 当它明显违反原始要求时,为什么 OP 将其标记为可接受的解决方案?
  • @Alex Reche Martinez:这意味着11 的唯一正确输出是“没有解决方案可能”或类似的内容。
【解决方案2】:

这是我的解决方案,结果将完美平衡并检测不可能的情况:

vector<int> recursive_splitnumber(int n) {

    if (n <= 5) {
        return vector<int>(1,n);
    }

    int unbalancer = 0;
    vector<int> result1, result2;
    do {
        int val1, val2;
        if (n%2 == 0) {
            val1 = n%2 + unbalancer;
            val2 = n%2 - unbalancer;
        }
        else {
            val1 = (n-1)%2 + 1 + unbalancer;
            val2 = (n-1)%2 - unbalancer;
        }

        result1 = recursive_splitnumber(val1);
        result2 = recursive_splitnumber(val2);

        // Concatenate the result of the even and odd splits
        result1.insert(result1.end(),result2.begin(),result2.end());

        ++unbalancer;

    } while (result1.size()%2 != 0 && unbalancer <= 1);
    return result1;
}

bool splitnumber(int n) {
    vector<int> split = recursive_splitnumber(n);
    if (split.size()%2 == 0) {
        copy(split.begin(), split.end(), ostream_iterator<int>(cout, " "));
        return true;
    } else
        return false;
}

该解决方案还将考虑数字 22 等情况,其中平衡除法给出 11+11(11 是无法使用给定规则表示的数字),细分将按照 10+12,然后 5 +5+6+6,最后是 5+5+3+3+3+3。

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 2011-07-27
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多