[面试备忘]字符串穷举排列 + 有序数组求和

给定一字符串(元素各不相同),打印出其所有可能组合

//已知一数N,在一有序数组中求两个数和为N,线性时间复杂度

#include <iostream>
#include
<cstring>
#include
"general.h"

template
<typename T>
void swap(T& pre, T& post)
{
T temp
= pre;
pre
= post;
post
= temp;
}
//给定一字符串(元素各不相同),打印出其所有可能组合
void printEverything(char* array, int leftLength)
{
if (array == NULL || leftLength == 0) {
return;
}
if (leftLength == 1) {
for (size_t index = 0; index != strlen(array); ++index) {
std::cout
<< array[index] << ' ';
}
std::cout
<< std::endl;
return;
}
int startIndex = strlen(array) - leftLength;
for (int index = startIndex; index != startIndex + leftLength; ++index) {
swap(array[startIndex], array[index]);
printEverything(array, leftLength
- 1);
swap(array[startIndex], array[index]);
}
}
//已知一数N,在一有序数组中求两个数和为N,线性时间复杂度
void getFitSum(const int* arrayASC, int length, int valueToFind)
{
if (arrayASC == NULL || length == 0 || valueToFind < arrayASC[0]) {
//wrong!
return;
}
for (int preFlag = 0, postFlag = length - 1; preFlag < postFlag; ) {
if (arrayASC[preFlag] + arrayASC[postFlag] == valueToFind) {
std::cout
<< arrayASC[preFlag] << " + " << arrayASC[postFlag] << " = " << valueToFind << std::endl;
--postFlag;
}
else if (arrayASC[preFlag] + arrayASC[postFlag] < valueToFind) {
++preFlag;
}
else {
--postFlag;
}
}
}

int main()
{
char array[] = "ABCDE";
printEverything(array, strlen(array));
int intArray[] = { 1, 3, 3, 3, 7, 12, 12, 12, 30, 66 };
getFitSum(intArray,
sizeof(intArray) / sizeof(*intArray), 15);
return 0;
}



posted @ 2011-09-20 17:56  lifengzhong  阅读(488)  评论(0编辑  收藏  举报