//@duanby 矩阵最大路径和 //L[i,j] = max{L[i-1,j-1]+a[i][j],L[i-1,j]+a[i][j]}; /* 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 */ int max__(int a, int b) { return a>b? a:b; } int GetMaxPath(int **Matrix, int N, int M) { int **L = new int*[N+1]; int i,j; for (i=0;i<N+1;++i) { L[i]=new int[M+1]; } for (j=0;j<M+1;++j) { L[0][j]=0; } for(i=0;i<N+1;++i) { L[i][0]=0; } int max = INT_MIN; for (i=1;i<N+1;++i) { for (j=1;j<=i;++j) { int temp = *((int *)Matrix+(i-1)*M+j-1); L[i][j]=max__((L[i-1][j-1]+temp),(L[i-1][j]+ temp)); if (L[i][j]>max) { max=L[i][j]; } } } return max; } int main() { int matrix[5][5]={ {7,0,0,0,0}, {3,8,0,0,0}, {8,1,0,0,0}, {2,7,4,4,0}, {4,5,2,6,5}, }; cout<<GetMaxPath((int **)matrix,5,5); }
寻找数组中的最小值和最大值.《编程之美》解法三,比较次数1.5N-2void GetMaxMinNum(int array[], int length, int &minNum, int &maxNum){if (NULL == array || length <= 0){return;}int posStart;if (length & 0x1 !=0){minNum = maxNum = array[0];posStart=1;}else{if (array[0]>array[1]){minNum=array[1];maxNum=array[0];}else{minNum=array[0];maxNum=array[1];}posStart = 2;}for (;posStart<length;posStart+=2){if (array[posStart]<array[posStart+1]){if (minNum>array[posStart]){minNum=array[posStart];}if (maxNum<array[posStart+1]){maxNum=array[posStart+1];}}else{if (minNum>array[posStart+1]){minNum=array[posStart+1];}if (maxNum<array[posStart]){maxNum=array[posStart];}}}return ;}
//全组合 void PrintSequence(int array[],int number,int length) { static vector<int> ivec; if (number==0) { copy(ivec.begin(),ivec.end(),ostream_iterator<int>(cout," ")); cout << endl; } else if(length>0) { ivec.push_back(*array); PrintSequence(array+1,number-1,length-1); ivec.pop_back(); PrintSequence(array+1,number,length-1); } } int main() { int arr[]={1,2,3,4}; for (int i = 1 ; i<=sizeof(arr)/sizeof(int); ++i) { PrintSequence(arr,i,sizeof(arr)/sizeof(int)); } }
typedef char ElemType; typedef struct node { ElemType data; node *lchild; node *rchild; }*BinaryTree; //建立二叉树 abd##e##cf##g## void CreateBinaryTree(BinaryTree &root) { ElemType value; cin >> value; if (value == '#') { root = NULL; } else { node *cur = new node; cur->data = value; cur->lchild=NULL; cur->rchild=NULL; root=cur; CreateBinaryTree(root->lchild); CreateBinaryTree(root->rchild); } } //前序遍历二叉树 abdecfg void PrintBinaryTree(BinaryTree root) { if (root==NULL) { return; } cout << root->data; PrintBinaryTree(root->lchild); PrintBinaryTree(root->rchild); } //二叉树中节点最大距离 static int getlong(BinaryTree root, int &high) { if (root==NULL) { high = 0; return 0; } int leftHigh,rightHigh; int leftDistance = getlong(root->lchild,leftHigh); int rightDistance = getlong(root->rchild,rightHigh); high = (leftHigh>rightHigh?leftHigh:rightHigh) +1; int maxDistance = (leftDistance>rightDistance?leftDistance:rightDistance); return maxDistance > (leftHigh+rightHigh) ? maxDistance:(leftHigh+rightHigh); } int GetLongestDistance(BinaryTree root) { if (NULL == root) { return 0; } int hight; return getlong(root,hight); } int main() { BinaryTree root=NULL; CreateBinaryTree(root); PrintBinaryTree(root); cout <<endl<< GetLongestDistance(root); return 0; }
//@duanby 随手写快排 void swap(int &a,int &b) { a=a^b; b=a^b; a=a^b; } int partition(int array[],int start,int end) { srand(time(NULL)); int pos = rand()%(end-start+1) + start; swap(array[end],array[pos]); int k = array[end]; int j = start-1; int i = start; for (;i<end;i++) { if (array[i]<k) { j++; swap(array[i],array[j]); } } swap(array[++j],array[end]); return j; } void QuickSort(int array[],int start, int end) { if (NULL == array) { return; } if (start<end) { int ret = partition(array,start,end); QuickSort(array,start,ret-1); QuickSort(array,ret+1,end); } }
int max_(int a, int b, int c) { int max = a>b?a:b; return max > c? max: c; } int min_(int a, int b, int c) { int min = a>b?b:a; return min < c? min:c; } //@duanby //动态规划,状态转移方程 //max[i]=max{a[i],max[i-1]*a[i],min[i-1]*a[i]} //min[i]=min{a[i],min[i-1]*a[i],max[i-1]*a[i]} void LongestMultiple(int array[],int len) { if (NULL == array || len <= 0) { return; } int *max = new int[len]; assert(max); int *min = new int[len]; assert(min); max[0]=array[0]; min[0]=array[0]; int maxValue=max[0]; for (int i = 1; i < len; ++i) { max[i]=max_(max[i-1]*array[i],min[i-1]*array[i],array[i]); min[i]=min_(max[i-1]*array[i],min[i-1]*array[i],array[i]); if (maxValue<max[i]) { maxValue=max[i]; } } if (maxValue<0) { cout << -1; } else cout << maxValue; delete [] max; delete [] min; } int main() { int arr[]={1,2,3,-1,5,-2}; LongestMultiple(arr,sizeof(arr)/sizeof(int)); }
//@duanby 打印循环矩阵... void PrintMatrix(const int N) { int **tancgle = new int *[N]; assert(tancgle); int i,j; for (i=0;i<N;++i) { tancgle[i] = new int[N](); assert(tancgle[i]); } int row,column; for(row=0,column=0;2*row<N&&2*column<N;row++,column++) { for (; column<N;column++) { if (row==0&&column==0) { column++; } if (tancgle[row][column]==0) { tancgle[row][column] = tancgle[row][column-1]+1; } else break; } for (row++,column--;row<N;row++) { if (tancgle[row][column]==0) { tancgle[row][column] = tancgle[row-1][column]+1; } else break; } for (column--,row--;column>=0;column--) { if (tancgle[row][column]==0) { tancgle[row][column] = tancgle[row][column+1]+1; } else break; } for (row--,column++;row>0;row--) { if (tancgle[row][column]==0) { tancgle[row][column] = tancgle[row+1][column]+1; } else break; } } for (i=0;i<N;++i) { for (j=0;j<N;++j) { cout << tancgle[i][j]<< "\t"; } cout << endl; } } int main() { PrintMatrix(6); }
void swap__(int &a,int &b) { a = a^b; b = a^b; a = a^b; } //@duanby 堆排序的2种操作,shiftdown,shiftup void shiftdown(int array[],int length,int pos) { if (NULL==array||length<=0||pos>length) { return; } int child; for(child=2*pos+1;child < length;pos = child,child=2*child+1) { if (child+1 < length && array[child+1] > array[child]) { child++; } if (array[pos]<array[child]) { swap__(array[pos],array[child]); } } } void shiftup(int array[],int length, int pos) { int parent; for (parent = ((pos-1)>>1);parent>=0;pos=parent) { if (array[parent]<array[pos]) { swap__(array[parent],array[pos]); } else break; } } int main() { int array[]={1,2,6,8,9,4}; int len = sizeof(array)/sizeof(int); for (i = ((len-1)>>1); i >=0; i--) { shiftdown(array,len,i); } for (i=len-1;i>=0;i--) { swap(array[i],array[0]); shiftdown(array,i,0); } }
void PrintHasWater(int **matrix,int row, int column) { int i,j; for (i=0;i<row;++i) { for (j=0;j<column;++j) { bool hasWater = true; if (j-1>=0 && *((int *)matrix+i*row+j)> *((int *)matrix+i*row+j-1) ) { hasWater=false; } if (i+1<=column-1 &&*((int *)matrix+i*row+j)> *((int *)matrix+(i+1)*row+j)) { hasWater=false; } if (j+1<=row-1 && *((int *)matrix+i*row+j)> *((int *)matrix+i*row+j+1)) { hasWater=false; } if (i-1>=0 && *((int *)matrix+i*row+j)> *((int *)matrix+(i-1)*row+j)) { hasWater=false; } if (hasWater) { cout << i <<"&" << j << " is "<< *((int *)matrix+i*row+j)<<endl; } } } } int main() { const int M = 3; const int N =3; int arr[M][N]= { {1,2,3}, {2,0,4}, {3,4,5}, }; PrintHasWater((int **)arr,M,N); }
void swap__(char &a, char &b) { if (a!=b) { a=a^b; b=a^b; a=a^b; } } // @duanby RGRBRB ---> RRGBB void SortRGB(char array[], int length) { if (NULL == array || length <= 0) { return; } char *rPos = array; char *bPos = array+length-1; char *gPos = array; while (gPos <= bPos) { if (*gPos=='R') { swap__(*rPos++,*gPos++); } else if (*gPos=='G') { gPos++; } else if (*gPos=='B') { swap__(*gPos,*bPos--); } } }
// 1~10的数, 和为12 void PrintSumSeq(int n, int sum, vector<int> &ivec) { if (0==n||sum<0) { return; } if (0==sum) { copy(ivec.begin(),ivec.end(),ostream_iterator<int>(cout," ")); cout << endl; return; } ivec.push_back(n); PrintSumSeq(n-1,sum-n,ivec); ivec.pop_back(); PrintSumSeq(n-1,sum,ivec); } int main() { vector<int> ivec; //1至10 之间的数,和为12.打印... PrintSumSeq(10,12,ivec); }
//@duanby array[] 元素差最大 bool gHasError=false; int GetMaxSub(int array[],int length, int &pos1, int &pos2) { if (NULL == array || length < 2) { gHasError=true; return 0; } int maxSub = array[1]-array[0]; int min = array[0]; pos1=1,pos2=1; int i; for (i=1;i<length;++i) { if (array[i]<min) { min = array[i]; pos2=i+1; } if (array[i]-min>maxSub) { maxSub=array[i]-min; pos1=i+1; } } return maxSub; } int main() { int arr[]={1,2,3,4,-5,9,100}; int a,b; cout << GetMaxSub(arr,sizeof(arr)/sizeof(int),a,b); cout << endl<<a<<" "<<b; }
//@duanby //*ab*cde* ---> ***abcde void MakeChange(char array[], int length) { if (NULL == array || length<=0) { return; } char *pStartPos = array + length -1; char *pChPos=array+length-1; char *pBegin = array; while(pChPos>array) { while (*pStartPos != '*') { pStartPos--; } while (*pChPos<'a'|| *pChPos > 'z') { pChPos--; } swap__(*pStartPos--,*pChPos--); } } int main() { char array[]="*ab*cde*"; MakeChange(array,sizeof(array)-1); }
//@duanby 2014迅雷笔试 第五题 编程,计算unicode字符串中多少字符。 int calc_utf8_count(unsigned char *data_ptr, unsigned int data_len) { int count = 0; //计算字符数 unsigned int pos = 0; while (pos < data_len) { if ((unsigned char)0 == (*(data_ptr+pos) & 0x80)) { pos++; count++; continue; } else if ((unsigned char)192 == (*(data_ptr+pos) & 0xe0)) { if (pos+1<data_len && ((*(data_ptr+pos+1)&0x80)==(unsigned char)128)) { pos+=2; count++; continue; } else return -1; } else if ((unsigned char)224 == (*(data_ptr+pos) & 0xe0)) { if (pos+1<data_len && ((*(data_ptr+pos+1)&0x80)==(unsigned char)128)) { if (pos+2<data_len && ((*(data_ptr+pos+2)&0x80)==(unsigned char)128)) { pos+=3; count++; continue; } else return -1; } else return -1; } else return -1; } return count; } int main() { unsigned char temparray[13]= { (unsigned char) 0xEF,(unsigned char) 0x8F,(unsigned char) 0xBC, (unsigned char) 0x6F, (unsigned char) 0xCF,(unsigned char) 0x8C, (unsigned char) 0xEF,(unsigned char) 0x8F,(unsigned char) 0xBC, (unsigned char) 0x6F, (unsigned char) 0x6F, (unsigned char) 0x6F, (unsigned char) 0x6F }; cout << calc_utf8_count(temparray,13)<<endl; }
//@duanby 矩阵最大路径和 //L[i,j] = max{L[i-1,j-1]+a[i][j],L[i-1,j]+a[i][j]}; /* 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 */ int max__(int a, int b) { return a>b? a:b; } int GetMaxPath(int **Matrix, int N, int M) { int **L = new int*[N+1]; int i,j; for (i=0;i<N+1;++i) { L[i]=new int[M+1]; } for (j=0;j<M+1;++j) { L[0][j]=0; } for(i=0;i<N+1;++i) { L[i][0]=0; } int max = INT_MIN; for (i=1;i<N+1;++i) { for (j=1;j<=i;++j) { int temp = *((int *)Matrix+(i-1)*M+j-1); L[i][j]=max__((L[i-1][j-1]+temp),(L[i-1][j]+ temp)); if (L[i][j]>max) { max=L[i][j]; } } } return max; } int main() { int matrix[5][5]={ {7,0,0,0,0}, {3,8,0,0,0}, {8,1,0,0,0}, {2,7,4,4,0}, {4,5,2,6,5}, }; cout<<GetMaxPath((int **)matrix,5,5); }
//@duanby 逆序对 int GetReverseNumCore(int array[],int start, int end) { if (start>=end) { return 0; } int mid = start + ((end - start)>>1); int midCount = 0; int i = start,j = mid+1; for (i = start;i<=mid;++i) { for (j = mid+1;j<=end;++j) { if (array[i]>array[j]) { midCount++; } } } int leftNum = GetReverseNumCore(array,start,mid); int rightNum = GetReverseNumCore(array,mid+1,end); return leftNum+rightNum+midCount; } int GetReverseNum(int array[],int length) { if (NULL == array || length <= 0) { return 0; } return GetReverseNumCore(array,0,length-1); } int main() { int arraya[]={7,5,6,4,3,1,10}; cout <<GetReverseNum(arraya,7); }
//一个长度为 n 的数组 a[0],a[1],...,a[n-1]。现在更新数组的名个元素,即
//a[0]变为 a[1]到 a[n-1]的积,a[1]变为 a[0]和 a[2]到 a[n- 1]的积,...,a[n-1]为 a[0]到 a[n-2]
//的积(就是除掉当前元素,其他所有元素的积)。
void arrayMul(int array1[],int array2[],int length)
{
int left = 1;
int right = 1;
int i;
for (i=0;i<length;++i)
{
array2[i]=1;
}
for (i=0;i<length;++i)
{
array2[i]*=left;
array2[length-i-1]*=right;
left *=array1[i];
right *=array1[length-i-1];
}
return;
}
test.
最新推荐文章于 2023-09-13 15:53:42 发布