面试例题(41-50)

数组越界

面试例题41:下面的程序有何缺点?

#define MAX 255
int main()
{
	unsigned char A[MAX],i;
	for(i = 0; i <= MAX;i++)
	{
		A[i] = i;
	}
	return 0;
}

解析:典型的数组越界问题。For循环执行了256次,而数组A只有255个元素。
答案:将循环控制条件i <= MAX 改为 i < MAX即可。

面试例题42:找出下面程序的错误,并解释它为什么是错的。

void test1()
{
	char string[10];
	char* str1 =0123456789;
	strcpy(string,str1);
	std::cout << string << ‘\n’;
}
void test2()
{
	char string[10],str1[10];
	for(int i = 0; i < 10; i++)
	{
		str1[i] = ‘a’;
	}
	strcpy(string,str1);
	std::cout << string << ‘\n’;
}
void test3(char* str1)
{
	char string[10];
	if(strlen(str1) <= 10)
	{
		strcpy(string, str1);
	}
std::cout << string << ‘\n’;
}

解析:字符数组和strcpy问题。
字符数组并不要求最后一个字符为’\0’。是否需要加入’\0’,完全由系统需要决定。但是字符数组的初始化要求最后一个字符必须为’\0’,所以test1会报错,test2虽然能够编译通过,但是会出现运行时错误。类似于char c[5] = {‘C’, ‘h’, ‘i’, ‘n’, ‘a’}这样的定义是错误的。 是正确的,但不能用于字符串的赋值操作。
答案:

void test1()
{
	char string[10];
	char* str1 =012345678;//错误1
	strcpy(string,str1);
	std::cout << string << ‘\n’;
}
void test2()
{
	char string[10],str1[10];
	for(int i = 0; i < 9; i++) //错误2
	{
		str1[i] = ‘a’;
	}
	Str1[9] = ‘\0;
	strcpy(string,str1);
	std::cout << string << ‘\n’;
	}
void test3(char* str1)
{
	char string[10];
	if(strlen(str1) <= 10)
	{
		strcpy(string, str1);
	}
	std::cout << string << ‘\n’;
}
int main()
{
	test1();
	test2();
	char* str =012345678;//错误3
	test3(str);
	return 0;
}

面试例题43:下面语句的输出是什么

char a = 256;
int d = a;
printf("%d", d+1);

A. -1 B. 1 C.257 D. 0
解析:char数值溢出问题。Char类型的变量赋值范围是0~255.当把256赋值给a后,超出了a的有效取值范围,此时a的实际值为0.
**//TODO//
答案:B。

数字流和数组声明

面试例题44:下面哪一个不是标准输入输出通道?

A. Std::cin B. std::cout C. std::cerr D. stream
解析:I/Ostream问题。头文件iostream中含有cin、cout、cerr几个对象,对应于标准输入流、标准输出流和标准错误流。
答案:D。

面试例题45:下面哪个数组的声明是正确的?

A. int a[]; B. int n = 10, a[n] C. int a[10 + 1] = {0}; D. int a[3] = {1,2,3,4};
解析:数组定义问题。
a[n],n必须是常理值。
int a[]是错误的,不允许建立空数组。
int a[3] = {1,2,3,4};会造成越界问题,因此不允许。
答案:B ,C。

字符串其他问题

面试例题46:输入一个数,测试其是否是回文数。

解析:建立数组,按位存储。比较首位和末位是否相同。如不同,则不是回文数。相同则继续比较,首位递增,末位递减,直到首位不再是小于末位。
答案:完整代码如下

#include<iostream>
using namespace std;
int main()
{
	int j = 10, k = 12321, p,a[10], ss, i = 0, begin , end;
	cout << “please input” << endl;
	cin >> k;
	p = k;
	while(p)
	{
		ss = p % 10;
		a[i] = ss;
		p = p /10;
		i++;
	}
	begin = 0;
	end = i -1;
	while(begin < end)
	{
		if(a[begin] != a[end])
		{
			Break;
		}		
		else
		{
			begin++;
			end--;
		}
	}
	if(begin < end)
	{
		cout<<false<< endl;
	}
	else
	{
		cout<<true<< endl;
	}
	cout << “i” << i << endl;
	cout << k;
	retrurn 0;
}

自己写的↓

bool isPalindrome(int num){
	//数字转字符串
	if (num < 0){
		return false;
	}
	vector<int> tranStr;
	while (num > 0){
		int temp = num % 10;
		tranStr.push_back(temp );
		num /= 10;
	}
	auto start = tranStr.begin();
	auto end = tranStr.end() - 1;
	while (start < end){
		if (*start != *end){
			return false;
		}
		++start;
		--end;
	}
	return true;
}

面试例题47:将字符串“askdaskaskdaskg”删除指定字符ask,删除后的结构是“ddg”。

解析:删除的最好办法就是把不删除的东西提取出来。
答案:完整代码如下

#include<stdio.h>
#include<string>
#include<conio.h>
int main()
{
	char uu[20];
	char *des= "ask", *source= "askdaskaskdas";
	char *p,*str2;
	int n = 0, i = 0, v;
	p = des;
	str2 = str;
	while(*str2)
	{
		while(*p)
		{
			if(*p == *str2)
			{
				break;
			}
			p++;
		}
		if(*p == ‘\0)
		{
			uu[i] = *str2;
			i++;
		}
		str2++;
		p = sub;
	}
	uu[i] = 0;
	str = uu;
	printf(“\n %s”,str);
	return 0;
}

面试例题48:请写一个函数来模拟C++中的strstr()函数:该函数的返回值是主串中字符子串的位置以后的所有字符。请不要使用任何C程序已有的函数来完成。

解析:string字符串问题。做一个程序模拟C++中的strstr()函数。Strstr()函数是把主串中子串及以后的字符全部返回。比如主串是“12345678”,子串是“234”,那么函数的返回值就是“2345678”。
答案:正确程序如下

#include<iostream>
using namespace std;
const char* strstr1(const char* string, const char* strCharSet)
{
	for (int i = 0; string[i] != '\0'; i++)
	{
		//子串的下标		
		int j = 0;
		int temp = i;
		if (string[temp] == strCharSet[j])
		{
			while (string[temp++] == strCharSet[j++])
			{
				if ((strCharSet[j] == '\0'))
				{
					return &string[i];
				}
			}
		}
	}
	return nullptr;
}
int main()
{
	char* string = "12345554555123";
	cout << string << endl;
	char strCharSet[10] = {};
	cin >> strCharSet;
	cout  << strstr1(string, strCharSet) << endl;
	system("pause");
	return 0; 
}

面试例题49:将一句话里的单词进行倒置,标点符号不倒换。比如一句话“i come from XiaMen”倒换后变成“XiaMen from come i”

解析:解决该问题可以分为两步:第一步全盘置换将该句变成,第二步进行部分翻转,如果不是空格,则开始翻转单词。
答案:具体代码如下

#include<iostream>
#include<stdio.h>
int main(void)
{
	int num = -12345, j = 0, i = 0, flag = 0, begin, end;
	char str[] = “i come from XiaMen”;
	char temp;
	j = strlen(str) - 1;
	printf(“string = %s\n”, str);
	//进行全部翻转
	while(j > i)
	{
		temp = str[i];
		str[i] = str[j];
		str[j] = temp;
		j--;
		i++;
	}
	printf(“string = %s\n”, str);
	i = 0;
	//对单独的单词进行翻转
	while(str[i])
	{
		if(str[i] != ' ')
		{
			begin = i;
			while(str[i] && str[++i] != ‘  ’)
			{
			}
			i = i - 1;
			end = i;
		}
		while(end > begin)
		{
			temp = str[begin];
			str[begin] = str[end];
			str[end] = temp;
			end--;
			begin++;
		}
		i++;
	}
	printf(“string = %s\n”, str);
	return 0;
}

面试例题50:有100个整数,其中有负数,找出连续3个数之和最大的部分。

答案:完整代码如下

#include<iostream>
using namespace std;
int main()
{
	int a[10] = {-3,4,6,8,-9,7,10,-6,20,-9}
	int sum = a[0]+a[1]+a[2]-1, index, i;
	for(i = 0; i <= 7; i++)
	{
		if(sum < a[i] + a[i + 1] + a[i + 2])
		{
			sum = a[i] + a[i + 1] + a[i + 2];
			index = i + 1;
		}
	}
	cout << “\n this is at the” << index <<3 number the sum is largest”;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值