笔试题[转]

今天班里同学分享了网易的笔试题,其中的一道题觉得挺有价值的,自己参考了网上的一些相关的资料做出了一种解法,发在这里与大家分享下,有不正确的地方请大家批评指正。 题目: 给定一个数字 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; } 以上就是我的解法,不知道还有没有更好的解法,欢迎大家来讨论批评指正
posted @ 2013-03-13 16:40  不想当元帅的好兵。  阅读(104)  评论(0编辑  收藏  举报