21、將數組的後面m個數移動爲前面m個數
題目:有n個整數,使前面各數後移m個位置,最後m個數變成最前面m個數,例如有10個數的數組,爲{1,2,3,4,5,6,7,8,9,10},n=10,如果m=5,調整後變爲{6,7,8,9,10,1,2,3,4,5}
分析: 可以通過遞歸的方法實現:
1、將前面n-m個元素的順序顛倒
2、將後面m個元素的順序顛倒
3、將n個元素的順序全部顛倒
void reverse(int* begin, int* end)
{
while(begin < end)
{
int tmp=*begin;
*begin++ = *end;
*end-- = tmp;
}
}
void Move(int a[],int n,int m)
{
reverse(a,a+n-m-1);
reverse(a+n-m,a+n-1);
reverse(a,a+n-1);
}
22、計算出序列的前n項數據
題目:正整數序列Q中的每個元素都至少能被正整數a和b中的一個整除,現給定a和b,如何計算出Q中的前幾項?例如:當a=3,b=5,N=6時,序列爲3,5,6,9,10,12
分析:可以與歸併排序聯繫起來,給定兩個數組A,B,數組A存放:3*1,3*2,3*3,... 數組B存放:5*1,5*2,5*3,...有兩個指針i,j,分別指向A,B的第一個元素,取Min(A[i],B[j]) 並將較小值的指針前移,然後繼續比較。
void Generate(int arry[],int a, int b, int N)
{
int tmpA,tmpB;
int i=1;
int j=1;
for(int k=0;k<N;k++)
{
tmpA=a*i;
tmpB=b*j;
if(tmpA <= tmpB)
{
arry[k]=tmpA;
i++;
}
else
{
arry[k]=tmpB;
j++;
}
}
}
23、判斷一個整數x是否可以表示成n(n>=2)個連續正整數的和
題目:判斷一個整數x是否可以表示成n(n>=2)個連續正整數的和
分析: 假設x可以表示成n個連續正整數的和,則數學表達式如下:x=m+(m+1)+(m+2)+...+(m+n-1) --> x=(2m+n-1)*n/2,變換後m=(2*x/n-n+1)/2 m>=1 即判斷(2*x/n-n+1)是否是偶數
int main()
{
int m=0,n=0,start=0,end=0,flag=0;
float tmp=0.0;
cout << "請輸入被分解的數" << endl;
cin >> m;
cout << "請輸入需要被分解的數字的個數" << endl;
cin >> n;
tmp=(float)m/n-(float)(n-1)/2;
if(tmp==(int)tmp)
{
for(flag=1,start=(int)tmp,end=start+n;start<end;start++)
cout << start <<' ';
cout << endl;
}
if(flag==0)
cout << "沒有符合條件的數" << endl;
}
24、找出數組中出現奇數次的元素
題目:給定一個含有n個元素的整型數組array,其中只有一個元素出現奇數次,找出這個元素
分析: 因爲對於任意一個數k;有k^k=0,k^0=k,所以將數組中所有元素進行異或,那麼個數爲偶數的元素異或後都變成了0,只留下了個數爲奇數的那個元素
int FindElementWithOddCount(int a[], int n)
{
int res=a[0];
for(int i=1;i<n;i++)
{
res ^=a[i];
}
return res;
}
25、二維數組中的查找
題目:在一個二維數組matrix中,每一行都從左到右遞增排序,每一列都從上到下遞增排序,在這個二維數組中判斷指定的數是否存在
分析:首先選取數組中右上角的數字,如果該數字等於要查找的數字,查找過程結束;如果該數字大於要查找的數字,剔除這個數字所在的列;如果該數字小於要查找的數字,剔除這個數字所在的行。也就是說如果要查找的數字不在數組的右上角,則每一次都在數組的查找範圍中剔除一行或者一列,這樣每一步都可以縮小查找範圍,直到要查找的數字,或者查找範圍爲空。查找步驟圖示如下:在下面的二維數組中查找7(參考於<<劍指offer>>)
bool Find(int* matrix, int rows, int columns, int number)
{
bool found = false;
if(matrix != NULL && rows > 0 && columns > 0)
{
int row = 0;
int column = columns - 1;
while(row < rows && column >=0)
{
if(matrix[row * columns + column] == number)
{
found = true;
break;
}
else if(matrix[row * columns + column] > number)
-- column;
else
++ row;
}
}
return found;
}