您的位置:首页 > 职场人生

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

2011-09-20 17:56 204 查看
给定一字符串(元素各不相同),打印出其所有可能组合

//已知一数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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐