21 计专

编写函数,统计一个字符中不同字符出现的次数,若某个字符连续出现多次,要求多次出现只按一次出现计算。如abcbbbd中,b出现的次数为2。

void Count(char *a,int n)
{
	int i, b[maxsize];
	b[0]=1;
	for(i=1;i<n;i++)
	{
		if(a[i]==a[i-1])  //确定出现的次数,如果是连续的,置0,非连续置1
			b[i]=0;
		else
			b[i]=1;
	}
	for(i=0;i<n;i++)
	{
		if(b[i]!=0)
		{
			int sum=b[i];  //记录每个字符出现的总的次数
		    for(int j=i+1;j<n;j++)
			{
				if(a[j]==a[i])
				{
					sum=sum+b[j];
					b[j]=0;    //已纳入记录的后序相同的字符置0不再遍历
				}
			}
			printf("字符%c出现的次数是%d\n",a[i],sum);
		}
		
	}
}

编写函数成反转链表,给定一个链表,从表头开始每两个相邻的节点为一对,反转每一对中的两个节点,要求交换节点位置,不是交换节点的值,整体顺序不变,末尾若是单个节点,则该节点位置不变,如12345,划分成对后为(1,2) (3,4) 5,反转后为21435。

void Reverse(Node head)  //设head是不带数据的哨位结点
{
	Node a,b,pre;
	if(head==NULL||head->next==NULL||head->next->next==NULL)//head为空,没有头结点,只有一个头结点,不处理
		return;
	pre=head;
	a=head->next;
	b=a->next;
	while(1)
	{
		Node ta,tb;
		ta=a,tb=b;
		ta->next=tb->next;  //交换一对结点
		tb->next=ta;
		pre->next=tb;

		a=tb;
		b=ta;  //恢复a,b指针的先后关系,始终是a在前,b在后
		if(b->next==NULL||b->next->next==NULL)//后面没有结点或者只有一个结点
			return;
		b=b->next->next;
		a=a->next->next;
		pre=pre->next->next;
		
	}
}

给定一颗二叉树,若二叉树的某个结点,其左子树所有节点之和与右子树所有结点之和相等,则称该节点为平衡节点,编写函数,判断节点值为整数的二叉树是否存在平衡结点。

typedef struct node 
{
	int data;
	struct node *left,*right;
}*Tree;
int sum_key(Tree t)  //求二叉树中所有结点之和
{
	if(t!=NULL)
	{
		return t->data+sum_key(t->left)+sum_key(t->right);  //如果题目问的结点数目之和相等,将t->data改为1,可得到结点数目和
	}
	else
	{
		return 0;
	}
}
bool Find_balance(Tree t)
{
	if(t!=NULL)
	{
		if(t->left!=NULL&&t->right!=NULL)
		{
			if(sum_key(t->left)==sum_key(t->right))  //当前结点是平衡结点
				return true;
		}
		return Find_balance(t->left)||Find_balance(t->right);
	}
	else  //空节点
		return false;
}

给定一个元素值都大于零的整数集合,编写函数,计算如下条件的一个最大子集。
1.子集中元素互不相等。
2.子集中任意两个元素大者除以小者的余数为0.

思路:二进制集合+符合两个条件的集合存下来

void f(int a[],int n)
{
	for(int i=0;i<n-1;i++)   //升序排序
		for(int j=0;j<n-1-i;j++)
			if(a[j]>a[j+1])
			{
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
	
	int max=0;
	int maxson[maxsize];
	for(int i=0;i<(1<<n);i++)
	{
		int count=0;
		int b[maxsize];//记录最大子集的元素
		for(int j=0;j<n;j++)
		{
			if(i&(1<<j))
			{
				b[count++]=a[j];  //选中a[j]
			}
		}
	    if(count>max)//判断是否满足倍数条件
		{
			int flag=1;
			for(int j=1;j<count;j++)
			{
				if(b[j]%b[j-1]!=0)
				{
					flag=0;
					break;
				}
			}
			for(int j=1;j<count;j++)//判断元素互不相等。因为数组是升序排序的,只需要比较相邻元素即可判断是否有相同元素
				if(b[j]==b[j-1])
				{
					flag=0;
					break;
				}
			if(flag==1)//满足条件,存子集
			{
				for(int j=0;j<count;j++)
					maxson[j]=b[j];
				max=count;
			}
		}
	}
	printf("{");
	int flag=1;
	for(int i=0;i<max;i++)
		if(flag==1)
		{
			printf("%d",maxson[i]);
			flag=0;
		}
		else
			printf(",%d",maxson[i]);
	printf("}");
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值