第一题:不与最大数相同的数字之和
输出一个整数数列中不与最大数相同的数字之和。
输入格式:输入分为两行:
第一行为 N(N 为接下来数的个数,N≤100);
第二行为 N 个整数,数与数之间以一个空格分开,每个整数的范围是−1,000,000 到 1,000,000。
输出格式
输出为 N个数中除去最大数其余数字之和。
sample 1
input | output |
---|---|
3 1 2 3 | 3 |
#include<stdio.h>
int main()
{
int n,i,arr[100]={0},max,add=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
max=arr[0];
for(i=0;i<n;i++)
{
if(arr[i]>max)
{
add+=max;
max=arr[i];
}
else
add+=arr[i];
}
printf("%d",add-arr[0]);
}
思路:变量max用于存储遍历至目前出现的最大值,add用来记录数字之和。用for循环遍历数组中的各个元素,进入循环之前先让max变量的值等于第一个元素的值。循环时,如果正在被遍历的元素值大于max,那么给add加上max值即上一个最大值,再将该值赋值给max。否则,给add加上该值。最终出来的结果会多加一次数组的第一个元素,因此输出之前要减去数组的第一个元素。
第二题:漂亮的字符串
小蒜认为如果一个字符串中每个字符出现的次数都是偶数次,那么这个字符串是美丽的;
现在给你一个字符串 ss,长度不超过 100,请判断这个字符串是否是美丽的。
输入格式:一个字符串 s。
输出格式:如果是美丽的字符串,输出 “Yes”,否则输出 “No”。
sample 1
input | output |
---|---|
abaccaba | Yes |
sample 2
input | output |
---|---|
hthth | No |
#include<stdio.h>
int main()
{
int i,flag=0,hash[52]={0};
char s[100];
scanf("%s",&s);
for(i=0;s[i]!=0;i++)
{
if(s[i]>='a'&&s[i]<='z')
hash[(int)s[i]-(int)'a']++;
else if(s[i]>='A'&&s[i]<='Z')
hash[(int)s[i]-(int)'A'+26]++;
}
for(i=0;i<52;i++)
{
if(hash[i]%2)
{
printf("No");
return 0;
}
}
printf("Yes");
return 0;
}
思路:创建一个大小为52的整型数组名为hash,对hash数组每个元素初始化为0,遍历s数组,每遍历一个元素就将就将该元素在hash数组中对应的元素+1,最终遍历hash数组,如果遇到元素为奇数,就打印出"No",否则打印"Yes"。至于如何对应,如果元素是小写英文字母,那么对应hash数组中下标为(int)s[i]-(int)'a'的元素,如果元素是大写英文字母,那么对应hash数组中下标为(int)s[i]-(int)'A'+26的元素。
第三题:车厢重组
在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。
Input
共两行。
第一行是车厢总数 N(≤10000)。
第二行是 N 个不同的数表示初始的车厢顺序。
Output
一个整数,最少的旋转次数。
Sample 1
input | output |
---|---|
4 4 3 2 1 | 6 |
#include<stdio.h>
int bubble(int*arr,int n)
{
int a=0,b=0,temp=0,count=0;
for(a=0;a<n-1;a++)
{
int flag=1;
int b=0;
for(b=0;b<n-a-1;b++)
{
if(arr[b]>arr[b+1])
{
temp=arr[b];
arr[b]=arr[b+1];
arr[b+1]=temp;
flag=0;
count++;
}
}
if(flag==1)
break;
}
return count;
}
int main()
{
int n,i,arr[10000]={0},count;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
count=bubble(arr,n);
printf("%d",count);
}
思路:该题所求旋转次数本质与冒泡排序过程中元素交换次数一样,因此对数组实现冒泡排序,并对元素交换次数进行记录,最终输出次数即可。
第四题:母牛的故事
有一头母牛,它每年年中生一头小母牛。每头小母牛从第四个年头开始,每年年中也生一头小母牛。请编程实现在第 n 年的时候(不算第 n 年出生的小母牛),共有多少头母牛?
输入格式:输入包括一个整数 n(0 < n < 55)。
输出格式:输出在第 n 年的时候母牛的数量。
sample 1
input | output |
---|---|
2 | 2 |
sample 2
input | output |
---|---|
5 | 6 |
#include<stdio.h>
int main()
{
int n,i;
scanf("%d",&n);
int a=1,b=0,c=0,d=0;
for(i=0;i<n;i++)
{
a=a+b;
b=c;
c=d;
d=a;
}
printf("%d",a+b+c);
return 0;
}
思路:本题看似很难,其实就是很难(kidding)。这个题的规律性很强,找规律即可。设置a、b、c、d四个变量分别用来存储本年的已经具有生育能力的母牛、差一年具有生育能力的母牛、差两年具有生育能力的母牛、差三年具有生育能力的母牛(即当年出生的)。那么每过一年,a=a+b,b=c,c=d,d=a,用循环语句即可实现。最终打印出a+b+c的值即可。
第五题:低洼地
一组数,分别表示地平线的高度变化。高度值为整数,相邻高度用直线连接。找出并统计有多少个可能积水的低洼地?
如图:地高变化为 0 1 0 2 1 2 0 0 2 0。
输入格式
第一行一个整数 n,表示有 n 个数。
第二行,n 个数 ai表示地平线高度,保证首尾为 0。
数据范围:3<=n<=10^4,0<=ai<=1000
输出格式
一个数,可能积水低洼地的数目。
Sample 1
input | output |
---|---|
10 0 1 0 2 1 2 0 0 2 0 | 3 |
#include<stdio.h>
int main()
{
int n,i,flag=1,count=0,arr[10000]={0};
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
for(i=1;i<n;i++)
{
if(arr[i]==arr[i-1])
continue;
if(flag==1&&arr[i]<arr[i-1])
flag=0;
else if(flag==0&&arr[i]>arr[i-1])
{
count++;
flag=1;
}
}
printf("%d",count);
return 0;
}
思路:设置一个变量名为flag,用来表示当前坡的状态,如果是下降状态,则flag为0,如果是上升则为1。初始时flag为1,从数组的第二个元素开始遍历。如果正在被遍历的元素和前一个元素一样,那么可以当作没有这个元素,直接进入下一次循环。否则,如果flag为1并且正在被遍历的元素比前一个元素小,则说明坡呈下降状态,给flag赋值为0。如果flag为1并且正在被遍历的元素比前一个元素大,则状态不变,不做处理。如果flag为0并且正在被遍历的元素比前一个元素小,则状态不变,不做处理。如果flag为0并且正在被遍历的元素比前一个元素大,则说明生成一个洼地,记录洼地个数的变量count加1,并且坡的状态变为上升,给flag赋值1。
第六题:删除数组中的元素(链表)
给定N个整数,将这些整数中与M相等的删除
假定给出的整数序列为:1,3,3,0,-3,5,6,8,3,10,22,-1,3,5,11,20,100,3,9,3
应该将其放在一个链表中,链表长度为20
要删除的数是3,删除以后,链表中只剩14个元素:1 0 -3 5 6 8 10 22 -1 5 11 20 100 9
要求:必须使用链表,不允许使用数组,也不允许不删除元素直接输出
程序中必须有链表的相关操作:建立链表,删除元素,输出删除后链表中元素,释放链表
不符合要求的程序即使通过,也会算作0分
Input
输入包含3行:
第一行是一个整数n(1 <= n <= 200000),代表数组中元素的个数。
第二行包含n个整数,代表数组中的n个元素。每个整数之间用空格分隔;每个整数的取值在32位有符号整数范围以内。
第三行是一个整数k,代表待删除元素的值(k的取值也在32位有符号整数范围内)。
Output
输出只有1行:
将数组内所有待删除元素删除以后,输出数组内的剩余元素的值,每个整数之间用空格分隔。
Sample
input | output |
---|---|
20 1 3 3 0 -3 5 6 8 3 10 22 -1 3 5 11 20 100 3 9 3 3 | 1 0 -3 5 6 8 10 22 -1 5 11 20 100 9 |
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int a;
struct node* next;
}node,*list;
list list_creat()//创建
{
list head=(list)malloc(sizeof(node));
if(head)
{
head->a=0;
head->next=NULL;
return head;
}
}
void list_insert(list head,int data)//增
{
list pos;
list newnode=(list)malloc(sizeof(node));
newnode->a=data;
newnode->next=NULL;
for(pos=head;pos!=NULL;pos=pos->next)
{
if(pos->next==NULL)
{
pos->next=newnode;
break;
}
}
}
void list_print(list head)//打印
{
list pos;
for(pos=head->next;pos!=NULL;pos=pos->next)
printf("%d ",pos->a);
}
int list_delete(list head,int data)//删
{
int sym=head->a;
int sym1=0;
list pos1=head;
list pos=head->next;
for(;pos!=NULL;)
{
sym1=0;
if((pos->a)==data)
{
pos1->next=pos->next;
pos=pos->next;
sym1=1;
(head->a)--;
}
if(sym1==0)
{
pos1=pos1->next;
pos=pos->next;
}
}
if(sym>(head->a))
return 1;
else if(sym==head->a)
return 0;
}
int main()
{
int n,a,k;
list head;
int arr[200000];
scanf("%d",&n);
for(a=0;a<n;a++)
scanf("%d",&arr[a]);
head=list_creat();
for(a=0;a<n;a++)
list_insert(head,arr[a]);
scanf("%d",&k);
list_delete(head,k);
list_print(head);
return 0;
}
思路:链表基本操作。