数组相关算法

问题1、打印1到最大的n位数

//解法一、直接求出n位数的最大值,然后直接从1开始打印
//缺陷:可能会溢出,大数问题
void Print1toMax(int n){
    int num=1;
    while(n>0){
        num*=10;
        n--;
    }
    for(int i=1;icout<" ";
    }
    cout<//解法二、在字符串上模拟数字加法
void Print1toMax(int n){
    int *a=new int[n+1];
    while(!Increment(number)){
        PrintNumber(number);
    }
}
bool Increment(char *number){
    int len=strlen(number);
    int takeover=0;
    bool isoverflow=false;
    for(int i=len-1;i>=0;i--){
        int nsum=number[i]-'0'+takeover;
        if(i==len-1){
            nsum++;
        }
        if(nsum>=10){
            if(i==0)
                    isoverflow=true;
            else{
                sum-=10;
                takeover=1;
                number[i]='0'+nsum;
            }
        }else{
            number[i]='0'+nsum;
            break;
       }
    }
    return isoverflow;
}
void PrintNumber(char *number){
    int len=strlen(number);
    for(int i=0;icout<cout<<" ";
}

//解法三、可以发现这就是n个0--9的全排列,只是0开头不打印出来。
void PrintNumber(int *number,int len){
    for (int i = 0; icout << number[i];
    }
    cout << " ";
}
void PermutationAll(int a[], int len, int index){
    if (index == len - 1){//递归的结束条件是已经设置好了最后一位
        PrintNumber(a,len);
        return;
    }
    for (int i = 0; i < 10; i++){
        a[index + 1] = i ;
        PermutationAll(a,len,index+1);
    }

}
void Print(int n){
    int *a = new int[n];
    for (int i = 0; i<10; i++){
        a[0] = i;
        PermutationAll(a,n,0);
    }

}

问题2、调整数组顺序使奇数位于偶数前面

void ChangePos(int a[],int n){
    int i=0;
    int j=n-1;
    while(i//从前往后找到第一个偶数,从后往前找到第一个奇数,互换
        while(i0x01)!=0)  i++;
        while(i0x01)==0)  j--;        
        swap(a[i],a[j]);
        i++;
        j--;
    }
}

问题3、寻找最小的k个数

//解法一、可以基于Partition函数来解决,但是会修改原来的数组
int Partition(int a[],int low,int high){
    int pivot=a[low];
    while(lowfor(;low=pivot;high--);
        if(lowfor(;lowif(lowreturn low;
}
void FindLeastKNum(int a[],int n,int k){
    if(a==NULL||n<1||k<1||k>n)    throw exception("error");
    int start=0;
    int end=n-1;
    int index=Partition(a,start,end);
    while(start1){
        if(index>k-1){
                end=index-1;
                index=Partition(a,start,end);
        }else{
                start=index+1;
                index=Partition(a,n,start,end);
        }
    }
    for(int i=0;icout<" ";
    cout<//解法二、特别适合处理海量数据

void FindLeastKNum(int a[], int n, int k){
    multiset<int, greater<int>>   intSet;
    int i = 0;
    for (; ifor (; iif (a[i]<*intSet.begin())
        {
            intSet.erase(intSet.begin());
            intSet.insert(a[i]);
        }
    }
    for (auto c : intSet)
        cout << c << " ";
    cout << endl;
}

问题4、把数组排成最小的数。
例如给定数组{3,32,321},则打印这3个数字能排成的最小数字321323

int compare(const void *str1, const void *str2){
    char *combinestr1 = new char[20];
    strcpy(combinestr1,*(char**)str1);
    strcat(combinestr1, *(char**)str2);

    char *combinestr2 = new char[20];
    strcpy(combinestr2, *(char**)str2);
    strcat(combinestr2, *(char**)str1);
    return strcmp(combinestr1,combinestr2);
}

int main(void)
{
    char *str[3] = {"32","3","321"};
    qsort(str, 3, sizeof(char*),compare);
    for (int i=0;i<3;i++)
        cout << str[i]<"pause");
    return 0;
}

你可能感兴趣的:(算法总结)