笔试题[转]
今天班里同学分享了网易的笔试题,其中的一道题觉得挺有价值的,自己参考了网上的一些相关的资料做出了一种解法,发在这里与大家分享下,有不正确的地方请大家批评指正。
题目:
给定一个数字 n (1= pBegin)
{
if(*pTemp-- == *pCh)
flag = true;
}
if(flag)
continue;
char temp = *pCh;
*pCh = *pBegin;
*pBegin = temp;
Permute2(pStr, pBegin + 1);
temp = *pCh;
*pCh = *pBegin;
*pBegin = temp;
}
}
}
void Permute2(char *pStr)
{
Permute2(pStr, pStr);
}
重回全排列的和问题
回到本文问题,思路应该就比较明朗了。
我的思路是,利用上述求不重复全排列的方法,求出所有的排列,然后相加。具体实现代码如下
void PermuteSum(std::vector& v_a, int beg, int& sum)
{
if(v_a.size() < 1)
return;
if(beg == v_a.size())
{
//每找到一个排列就累加进sum
int factor = 1;
for(int i = v_a.size() - 1; i >= 0; --i)
{
sum += v_a[i] * factor;
factor *= 10;
}
}
else
{
for(int i = beg; i < v_a.size(); ++i)
{
bool flag = false;
int j = i - 1;
while(!flag && j >= beg)
{
if(v_a[j--] == v_a[i])
{
flag = true;
break;
}
}
if(flag)
continue;
int temp = v_a[beg];
v_a[beg] = v_a[i];
v_a[i] = temp;
PermuteSum(v_a, beg + 1, sum);
temp = v_a[beg];
v_a[beg] = v_a[i];
v_a[i] = temp;
}
}
}
int PermuteSum(int a)
{
int sum = 0;
std::vector v_a;
while(a != 0)
{
//这里把a的每一位放入vector中,虽然逆序了,但不影响排列,所以不需要再做一次逆序
v_a.push_back(a % 10);
a = a / 10;
}
PermuteSum(v_a, 0, sum);
return sum;
}
以上就是我的解法,不知道还有没有更好的解法,欢迎大家来讨论批评指正