//在[nBegin,nEnd)区间中是否有字符与下标为pEnd的字符相等
bool IsSwap(char* pBegin , char* pEnd)
{
char *p;
for(p = pBegin ; p < pEnd ; p++)
{
if(*p == *pEnd)
return false;
}
return true;
}
//如 abc 的全排列(去掉重复的全排列): abc, acb, bca, dac, cab, cba
void PermutationDiff(char* pStr, char* pBegin)
{
assert(pStr && pBegin);
if(*pBegin == '\0')
printf("%s\n",pStr);
else
{
for(char* pCh = pBegin; *pCh != '\0'; pCh++)
{
if (IsSwap(pBegin, pCh))
{
swap(*pBegin,*pCh);
PermutationDiff(pStr, pBegin+1);
swap(*pBegin,*pCh);
}
}
}
}
//如 abc 的全排列: abc, acb, bca, dac, cab, cba
void Permutation(char* pStr, char* pBegin)
{
assert(pStr && pBegin);
if(*pBegin == '\0')
printf("%s\n",pStr);
else
{
for(char* pCh = pBegin; *pCh != '\0'; pCh++)
{
swap(*pBegin,*pCh);
Permutation(pStr, pBegin+1);
swap(*pBegin,*pCh);
}
}
}
//求有序数组中和为给定值的数组两个数
bool GetSumElement(int a[], int len, int *v1, int *v2, int sum)
{
int low = 0;
int high = len - 1;
int compare;
while (low < high)
{
compare = a[low] + a[high];
if (compare == sum)
{
*v1 = low;
*v2 = high;
return true;
}
else if (compare > sum)
{
high--;
}
else
{
low++;
}
}
return false;
}
// 求一个数组中两个元素的最大差值 [7,1,5,3,6,4] return [5][1][6]
int maxProfit(vector<int>& prices, int *a, int *b)
{
vector<int>::iterator it = prices.begin();
int minleft = *it;
it++;
int maxDiff = *it - minleft;
for (; it != prices.end(); it++)
{
if (*it < minleft)
{
minleft = *it;
*a = minleft;
}
if (*it - minleft > maxDiff)
{
maxDiff = *it - minleft;
*b = *it;
}
}
return abs(maxDiff);
}
int main(int argc, char **argv)
{
vector<int> prices;
prices.push_back(7);
prices.push_back(1);
prices.push_back(5);
prices.push_back(3);
prices.push_back(6);
prices.push_back(4);
int a,b;
// 求数组中的最大差值
Visit(maxProfit(prices, &a, &b));
Visit(a);
Visit(b);
int v[] = {1, 2, 3, 4, 8};
GetSumElement(v, 5, &a, &b, 6);
Visit(a);
Visit(b);
// 字符串的全排列
printf("\nPermutation:\n");
char str[] = "abc";
Permutation(str,str);
// 相同字符串的全排列
printf("\nPermutationDiff:\n");
char strdiff[] = "baa";
PermutationDiff(strdiff,strdiff);
}