移动应用开发实验室二面题目

第一题:不与最大数相同的数字之和

输出一个整数数列中不与最大数相同的数字之和。

输入格式:输入分为两行:

第一行为 N(N 为接下来数的个数,N≤100);

第二行为 N 个整数,数与数之间以一个空格分开,每个整数的范围是−1,000,000 到 1,000,000。

输出格式
输出为 N个数中除去最大数其余数字之和。

sample 1

inputoutput

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

inputoutput      
abaccabaYes

sample 2

inputoutput
hththNo

#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

inputoutput

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

inputoutput
22

sample 2 

inputoutput
56

#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

inputoutput

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

inputoutput

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;
}

思路:链表基本操作。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值