C语言中棘手的面试问题
在以下采访问题中: 给我一个数字,给我数字 (在C语言中棘手的面试问题,c,puzzle,C,Puzzle,在以下采访问题中: 给我一个数字,给我数字 (在3..5和偶数个 数字),其相加将返回 原来的号码。结果数字 应该尽可能保持平衡,, 这意味着不是返回3 和5,例如,返回4和 4。例: 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
3..5
和偶数个
数字),其相加将返回
原来的号码。结果数字
应该尽可能保持平衡,,
这意味着不是返回3
和5
,例如,返回4
和
4
。例:
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;
}
}
}
}
但我仍然不能完成所有的案子。。。如果(n<4)打印n,我应该如何检查答案是否有不平衡的解决方案??;
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
其他的
交换机(n%4)
案例0:*打印编号4*
案例1:*打印n/4-14个*打印5个
案例2:*打印n/4-1 4的*打印3打印3
案例3:*打印件编号4个*打印件3个
在C语言中实现效率稍低#
if(n<4)控制台写入线(n);
其他的
交换机(n%4)
{
案例0:
Console.WriteLine(String.Join(“,新字符串('4',n/4).ToArray());
打破
案例1:
控制台写入线(
(String.Join(“,新字符串('4',n/4).ToArray().Skip(1))+
“5”).TrimStart());
打破
案例2:
控制台写入线(
(String.Join(“,新字符串('4',n/4).ToArray().Skip(1))+
“3”).TrimStart());
打破
案例3:
Console.WriteLine(String.Join(“),新字符串('4',n/4).ToArray()+
" 3"));
打破
}
以下是我的解决方案,结果将完全平衡,并检测不可能的情况:
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;
}
vector recursive\u splitnumber(int n){
如果(这是一个多么烦人的面试问题。如果这份工作是一个html开发人员,你会得到额外的分数。为什么24
会被分解成6+6+6+6
,而不是4+4+4+4+4
?你可以有偶数……是的,4+4+4+4+4+4也是一个答案,3..5
如果你可以使用任何整数,那意味着什么呢e解决方案必须打印偶数个数字?如果n=11
则打印4 3
@srgerg没有注意到这一点。对于11,没有只打印数字3、4和5以及偶数个数字的解决方案。为什么OP将其标记为可接受的解决方案,而它显然违反了原始要求?@Alex Reche Martinez:这意味着11
的唯一正确输出是“不可能有解决方案”或类似的内容。
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;
}