编写函数,统计一个字符中不同字符出现的次数,若某个字符连续出现多次,要求多次出现只按一次出现计算。如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("}");
}