四道算法面试题

来源:互联网 发布:个体软件过程 编辑:程序博客网 时间:2024/06/08 02:23

//在[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);

}

0 0
原创粉丝点击