test.

27 篇文章 0 订阅
//@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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值