问题1、打印1到最大的n位数
//解法一、直接求出n位数的最大值,然后直接从1开始打印
//缺陷:可能会溢出,大数问题
void Print1toMax(int n){
int num=1;
while(n>0){
num*=10;
n--;
}
for(int i=1;i<num;i++){
cout<<i<<" ";
}
cout<<endl;
}
//解法二、在字符串上模拟数字加法
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;i<len;i++){
cout<<number[i];
}
cout<<" ";
}
//解法三、可以发现这就是n个0--9的全排列,只是0开头不打印出来。
void PrintNumber(int *number,int len){
for (int i = 0; i<len; i++){
cout << 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<j){
//从前往后找到第一个偶数,从后往前找到第一个奇数,互换
while(i<j&&(a[i]&0x01)!=0) i++;
while(i<j&&(a[j]&0x01)==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(low<high){
for(;low<high&&a[high]>=pivot;high--);
if(low<high) a[low++]=a[high];
for(;low<high&&a[low]<=pivot;low++);
if(low<high) a[high--]=a[low];
}
a[low]=pivot;
return 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(start<end&&index!=k-1){
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;i<k;i++)
cout<<a[i]<<" ";
cout<<endl;
}
//解法二、特别适合处理海量数据
void FindLeastKNum(int a[], int n, int k){
multiset<int, greater<int>> intSet;
int i = 0;
for (; i<k; i++)
intSet.insert(a[i]);
for (; i<n; i++){
if (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]<<endl;
system("pause");
return 0;
}