欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

某为线上笔试心得

程序员文章站 2022-05-28 22:28:59
...

之前投了某为的软件开发岗,顺利通过简历筛选后参加了今晚的线上笔试。总的来说,某为的题并不难,总共三道编程题,粗暴但不简单。笔试期间脑子略有点发昏,导致第二道编程题栽在了一个小问题上,在交卷后左思右想在Linux上又重新写出程序编译,才发现问题所在。大概最大的感受就是遗憾吧。

某为的第一道笔试题是输入长度未知的字符串,然后去重,不改变排列顺序输出字符串(字符串中不包含空格)。这一题比较简单,考虑到c语言用char*指针作为字符串时,在读取字符串时需要一个特殊字符'\0'来标记指针的结束位置,也就是通常认为的字符串结束标记。而c++语言则是面向对象的,长度信息直接被存储在了对象的成员中,读取字符串可以直接根据这个长度来读取,所以就没必要需要结束标记了。可以将string对象中重复的字符用'\0'代替,编写程序:

#include <iostream>
#include <string>

using namespace std;
int main()
{
	int len;
	string str;
	cout << "输入字符串:";
	cin >> str;
	len = str.size();
	for(int i=0;i<len-1;i++){
		if(str[i]!='\0'){
			for(int j=i+1;j<len;j++){
				if(str[i]==str[j]){
					str[j]='\0';
				}
			}
		}
		else{
			continue;
		}
		
	}
	cout << "去重后:" << str <<endl;
	return 0;
}

编译和调试结果:

某为线上笔试心得

某为的第二道笔试题的大意是12点到20点(分为8个整点时间区间)之间会有客人到来以及离去(到来和离去都看做整点,客人需在12点之后到来,20点之前离开),统计所有客人停留的时间长度(输入不多于100个客人的到达整点时间和离开整点时间,以“-1 -1”结束输入),最终输出每个时间区间客人的最大数目。题目意思有点绕,但是读明白就能理解,重点是以每个客人停留的时间作为循环的起点和重点,对于这段时间内的区间各加上一个“1”。

那么,可以编写程序:

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
int main(){
	int a[100][2]; //定义最大输入容量
	int group[8]; //定义8个整数区间
	int count = 0; //定义实际输入“客人”个数的统计参数
	int flag = 1; //定义了两次跳出循环的信号参数
	for(int i=0; i<100; i++){ //将输入信息循环存储到数组中
		for(int j=0; j<2; j++){
			scanf("%d",&a[i][j]);
			if(a[i][j] == -1){
				flag = 0;
				break;
			}

		}
		if(flag == 0){break;}
		else{count++;}
	}
	for(int i=0; i<8; i++){ //对group数组元素进行初始化
		group[i]=0;
	}
	for(int i=0; i<count; i++){
		for(int j=a[i][0]-12; j<a[i][1]-11; j++){ //循环遍历时间段内所有区间,对应的group加1
			group[j]++;
		}
	}
	cout << "[12,13):" << group[0] << endl;
	cout << "[13,14):" << group[1] << endl;
	cout << "[14,15):" << group[2] << endl;
	cout << "[15,16):" << group[3] << endl;
	cout << "[16,17):" << group[4] << endl;
	cout << "[17,18):" << group[5] << endl;
	cout << "[18,19):" << group[6] << endl;
	cout << "[19,20):" << group[7] << endl;
	return 0;
}

调试结果:

某为线上笔试心得

其中,第一次调试结果中出现数字乱码是因为数组没有进行初始化赋值。

在笔试的过程中,对于for(int j=a[i][0]-12; j<a[i][1]-11; j++)语句,我不慎将二维数组的下标起点记错了,即for(int j=a[i][1]-12; j<a[i][2]-11; j++),导致程序始终无法通过编译。提示存在段错误(堆栈或者数组存在溢出)。

相关标签: C 编程