【无标题】

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

第一题

【无标题】_第1张图片
思路:

  1. 通过排序算法,先给整个数组排序
  2. 然后从头开始遍历,遍历的时候需要判断数字是否小于数组中最后一个数。

排序完成之后的代码如下:

	for (i = 0; i < n; i++) {
		if (arr[i] < arr[n-1]) {	//arr[i]表示那一组数,if确保对应的数小于最大值
			sum = sum+arr[i];		//sum表示求和
			}
	}

基础的排序算法

  1. 选择排序:
    思路:
    (1)读入数据存放在a数组中
    (2)在a[0]~a[n]中选择值最小的元素,与第一位元素交换,则把最小的元素放入a[0]中。
    (3)在a[1]~a[n]中选择值最小的元素,与第二位元素交换,则把最小的元素放入a[1]中。
    (4)以此类推。
    (5)直到第n-1元素与第n个元素比较排序为止。
	void arr_sort(int*p,int n) {
		int i, j;
		int min = 0;
		for (i = 0; i < n-1; i++) {	//排序次数
			min = i;
			for (j = i+1; j < n; j++) {
				if (p[j] < p[min]) {
					min = j;	//记录交换的元素下标
				}
			}
			if (i != min) {
				int tmp = p[i];
				p[i] = p[min];
				p[min] = tmp;
			}
		} 
	}
  1. 插入法排序
    思路:
    每一步将一个数插入一个已经排好的序列中,并使之保持有序。
    直到插完所有的数为止。
 void insertion_sort(int*p,int n) {
 	int i, j, tmp;
 	for (i = 1; i < n;i++) {	//从第二个数字开始
 		tmp = p[i];
 		for (j = i-1; j > 0; j--) { //从后往前找第一个比tmp小的数字
	 		if (num[j] > tmp) {//arr[j]需要后移
	 			arr[j+1] = arr[j];
	 		} else {
	 			break;
	 		}
	 	}
 	}
 }

第二题:
【无标题】_第2张图片
思路:

  1. 小写只要26个字母在本字符串中均出现偶数次,则为美丽字符串。
#include 
#include 
using namespace std;
int main() {
	int num[26];
	int i;
	for (i = 0; i < 26; i++) {
		num[i] = 0;	//初始化数组每个元素都为0,统计小写字母的个数 
	}
	string goal;
	cin>>goal;
	for (i = 0; i < goal.length()-1; i++) {
		int tmp = 0;
		tmp = goal[i]-97;
		num[tmp]++
	} 
	for (i = 0; i <= 25; i++) {
		printf("%c的个数为%d",(i+97),num[i]);
	}
	int doubt = 1;
	for (i = 0; i <= 25; i++) {
		if(num[i]%2 != 0) {
			doubt = 0;//如果有一位不是偶数,则该字符串不为完美字符 
			break;
		}
	}
	if (doubt == 1) {
		printf("Yes");
	} else {
		printf("No");
	}
	return 0;
}

第三题:
【无标题】_第3张图片
思路:

相当于使用冒泡排序对这组数据进行排序,然后用count进行计数,每交换一次,技术一次。
操作代码如下:

#include 
int main() {
	int i,j;
	int count = 0;
	for (i = 0; i < n-1; i++) {
		for (j = 0; j < n-i-1; j++) {
			if (arr[j] > arr[j+1]) {
				count++; 
			}
		}
	}
	printf("%d",count);
}

第四题:
【无标题】_第4张图片
思路:

  1. 首先列举出前几年可生产母牛的数量和小奶牛的数量。
  2. 寻找当中的规律。
  3. 可以发现从第四年开始总数等于前一年的总数加上前前一年的总数。
#include 
int main()
{
	int n,i;
	scanf("%d",&n);
	int arr[n+1];
	for(i = 0; i < n+1; i++)
	{
		if(i < 2)
		{
			arr[i] = 1;
		}
		else if(i == 2||i == 3)
		{
			arr[i] = arr[i-1]+arr[i-2];
		}
		else 
		{
			arr[i] = arr[i-1]+arr[i-3];		
		}
	}
	printf("%d",arr[n]);
}

第五题:
【无标题】_第5张图片
思路:
建立一个数组h,存放山的高度,并从第3座山峰(h[2])开始(第一座山默认高度为0,故第二座山一定不会是低洼地),逐个比较它与它左右山峰的高度,若在三者中它最矮,则低洼地数量+1。如果碰上右侧的山和它一样高,则将右侧山的角标+1,看看还是不是一样高,若是就继续+1,直到不一样高就开始比较,得出结论。(或者说碰到左侧的山跟它一样高,就将左侧山的角标-1,后续操作类似。但要注意两种判别法不能同时使用,否则会出现一个洼地被计算两次的情况,正确做法是二者取其一)直到遍历到倒数第三座山(h[n-3]),计算完毕并输出洼地数量。
代码:

#include 
int cnt;
int main() {
	itn i,j,k;
	int n;
	scanf("%d",&n);
	int h[10005];
	for(i = 0; i < n; i++) {
		scanf("%d",&h[i]);
	}
	for(i = 2; i < n-2; i++) {
		 j = i+1, k = i-1;
		 if(h[j] > h[i]&&h[k] > h[i]) {
		 	cnt++;
		 	continue;
		 }
		 else if (h[k] == h[i]&&h[j] > h[i]) {
		 	while (h[k] == h[i]) {
		 		k++;
			 }
			 if(h[k] > h[i]) {
			 	cnt++;
			 	continue;
			 }
		 }
	}
	printf("%d",cnt);
	return 0;
}

你可能感兴趣的:(算法,排序算法,数据结构)