笔试题练习10道

简介: 1 输入一串字符串,其中有普通的字符与括号组成(包括’(’、’)’、’[',']‘),要求验证括号是否匹配,如果匹配则输出0、否则输出1. #include <iostream>using namespace std;int verify(char* ch);void main(){ char* ch = "((([])))[]"; cout<<ver

输入一串字符串,其中有普通的字符与括号组成(包括’(’、’)’、’[',']‘),要求验证括号是否匹配,如果匹配则输出0、否则输出1.

#include <iostream>
using namespace std;
int verify(char* ch);
void main()
{
	char* ch = "((([])))[]";
	cout<<verify(ch)<<endl;
}

int verify(char* ch)
{
	char marker[100] = {0};
	while (*ch)
	{
		if (*ch == '(' || *ch == '[')
		{
			marker[strlen(marker)] = *ch;
		}
		else if (*ch == ')')
		{
			if (marker[strlen(marker)-1] == '(')
			{
				marker[strlen(marker)-1] = '\0';
			}
			else
			{
				return 1;
			}
		}
		else if (*ch == ']')
		{
			if (marker[strlen(marker)-1] == '[')
			{
				marker[strlen(marker)-1] = '\0';
			}
			else
			{
				return 1;
			}
		}
		ch++;
	}

	if (strlen(marker) == 0)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

输入一行数字:123 423 5645 875 186523

在输入第二行:23

将第一行中含有第二行中”23″的数输出并排序
结果即:123 423 186523

#include <iostream>
using namespace std;

void main()
{
	int num[20] = {0};
	int sort[20] = {0};
	int n;
	char c = ' ';
	int i = 0;
	int temp;
	while (c != '\n')
	{
		scanf("%d%c", &temp, &c);
		num[i++] = temp;
	}
	scanf("%d", &n);

	int index = 0;
	for (int j = 0; j < i; j++)
	{
		temp = num[j];
		while (temp >= n)
		{
			if (temp % 100 == n)
			{
				sort[index++] = num[j];
				break;
			}
			else
			{
				temp /= 10;
			}
		}
	}

	for (int k = 0; k < index; k++)
	{
		cout<<sort[k]<<endl;
	}
}

输入m个字符串 和一个整数n, 把字符串M化成以N为单位的段,不足的位数用0补齐。

如 n=8 m=9 ,

123456789划分为:12345678

                 90000000

123化为:12300000

#include <iostream>
using namespace std;

void main()
{
	char ch[20];
	cin>>ch;
	int n;
	cin>>n;
	char temp[20] = {0};
	char* word[10];
	int index = 0;
	for (int i = 0; i < strlen(ch); i += n)
	{
		memcpy(temp,ch+i,n);
		if (strlen(ch) - i < n)
		{
			int k = 0;
			while (temp[k] != '\0')
			{
				k++;
			}
			while (k < n)
			{
				temp[k++] = '0';
			}
		}
		cout<<temp<<endl;
	}
}

将电话号码 one two 。。。nine zero翻译成1  2 。。9 0,中间会有double

例如

输入:OneTwoThree       输出:123

输入:OneTwoDoubleTwo   输出:1222

输入:1Two2             输出:ERROR

输入:DoubleDoubleTwo   输出:ERROR

有空格,非法字符,两个Double相连,Double位于最后一个单词都错误

#include <iostream>
using namespace std;

void main()
{
	char num[10][6] = {"Zero","One","Two","Three","Four","Five","Six","Seven","Eight","Nine"};
	char phone[7];
	char c = ' ';
	char result[10] = {0};
	int countDouble = 0;
	int index = 0;
	while (c != '\n')
	{
		scanf("%s%c",&phone,&c);
		for (int i = 0; i < 10; i++)
		{
			if (!strcmp(phone,num[i]) && i < 10)
			{
				result[index++] = i + '0';
				if (countDouble == 1)
				{
					result[index++] = i + '0';
					--countDouble;
				}
				break;
			}
			else if (!strcmp(phone,"Double"))
			{
				++countDouble;
				if (countDouble > 1)
				{
					cout<<"Error!"<<endl;
					return;
				}
				break;
			}
			else
			{
				cout<<"Error!"<<endl;
				return;
			}
		}
	}
	if (countDouble != 0)
	{
		cout<<"Error!"<<endl;
		return;
	}
	cout<<result<<endl;
}

5 将整数倒序输出,删除重复数据

输入一个整数,如12336544,或1750,然后从最后一位开始倒过来输出,最后如果是0,则不输出,输出的数字是不带重复数字的,所以上面的输出是456321和571。如果是负数,比如输入-175,输出-571。

#include <iostream>
using namespace std;

void numreverse(char* num);
void removezero(char* num);
void removereplicate(char* num);
void removereplicate2(char* num);
void main()
{
	char num[20] = "-122001100";
	removezero(num);
	numreverse(num);
	removereplicate2(num);
	cout<<num<<endl;
}

void numreverse(char* num)
{
	char c;
	int i = 0;
	char* temp = num;;
	if (num[0] == '-')
	{
		temp++;
	}
	int len = strlen(temp);
	for (; i < len / 2; i++)
	{
		c = temp[i];
		temp[i] = temp[len-i-1];
		temp[len-i-1] = c;
	}
}
void removezero(char* num)
{
	char* temp = num + strlen(num) - 1;
	while (*temp == '0')
	{
		*temp = '\0';
		temp--;
	}
}

//去掉相邻的重复字符
void removereplicate(char* num)
{
	char* temp = num;
	int index = 0;
	for (int i = 0; i < strlen(num); i++)
	{
		if (temp[i] != temp[i+1])
		{
			num[index++] = temp[i];
		}
	}
	num[index] = '\0';
}

//去掉所有的重复字符
void removereplicate2(char* num)
{
	char* temp = num;
	int index = 0;
	bool exist[10] = {0};
	if (temp[0] == '-')
	{
		num[index++] = '-';
	}
	for (int i = 1; i < strlen(num); i++)
	{
		if (exist[temp[i] - '0'] == 0)
		{
			num[index++] = temp[i];
			exist[temp[i]-'0'] = 1;
		}
	}
	num[index] = '\0';
}

编程的时候,if条件里面的”(“、”)”括号经常出现不匹配的情况导致编译不过,请编写程序检测输入一行if语句中的圆括号是否匹配正确。同时输出语句中出现的左括号和右括号数量,如if((a==1)&&(b==1))是正确的,而if((a==1))&&(b==1))是错误的。注意if语句的最外面至少有一对括号。提示:用堆栈来做。

输入:if((a==1)&&(b==1))

输出:RIGTH 3 3

输入:if((a==1))&&(b==1))

输出:WRONG 3 4

#include <iostream>
using namespace std;

void main()
{
	char ch[100];
	cin.getline(ch,100);
	int left = 0;
	int right = 0;
	int countleft = 0;
	int countright = 0;
	bool existif = false;
	int flag = 0; //看连着if的括号是否过早被匹配
	bool bflag = false;
	int i,j;
	for (i = 0; i < strlen(ch); i++)
	{
		if (ch[i] == 'i' && ch[i+1] == 'f')
		{
			existif = true;
			break;
		}

		if (!existif && ch[i] == '(')
		{
			break; 
		}
	}

	for (int j = 0; j < strlen(ch); j++)
	{
		if (ch[j] == '(')
		{
			 left++;
			 flag++;
		}
		else if (ch[j] == ')')
		{
			right++;
			flag--;
			if (j < strlen(ch) - 1 && flag == 0)
			{
				bflag = true;
			}
		}
	}

	if (!bflag && existif && right == left)
	{
		cout<<"RIGHT "<<left<<" "<<right<<endl;
	}
	else
	{
		cout<<"WRONG "<<left<<" "<<right<<endl;
	}
}


统计数字出现的次数,最大次数的统计出来

举例:

输入:323324423343

输出:3,6

#include <iostream>
using namespace std;

void main()
{
	char ch[50];
	char* p = ch;
	cin>>ch;
	int b[10] = {0};
	while (*p)
	{
		b[*p++ - '0']++;
		
	}

	int max = b[0];
	int index = 0;
	for (int i = 1; i < 10; i++)
	{
		if (b[i] > max)
		{
			max = b[i];
			index = i;
		}
	}

	cout<<index<<" "<<b[index]<<endl;
}

8 字符串首字母转换成大写
举例:
输入:this is a book
返回:This Is A Book

#include <iostream>
using namespace std;

void main()
{
	char ch[50];
	cin.getline(ch,50);
	if (ch[0] != ' ')
	{
		ch[0] -= 32;
	}
	
	for (int i = 0; i < strlen(ch); i++)
	{
		if (ch[i] == ' ' && ch[i+1] != ' ')
		{
			ch[i+1] -= 32;
			i++;
		}
	}

	cout<<ch<<endl;
}

9 子串分离 
题目描述:   
通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。请编写一个程序,自动分离出各个子串,并使用’,'将其分隔,并且在最后也补充一个’,'并将子串存储。  
如果输入”abc def gh i        d”,结果将是abc,def,gh,i,d, 
要求实现函数:   
void DivideString(const char *pInputStr, long lInputLen, char *pOutputStr); 
【输入】  pInputStr:  输入字符串 
          lInputLen:  输入字符串长度                   
【输出】  pOutputStr:  输出字符串,空间已经开辟好,与输入字符串等长;

#include <iostream>
using namespace std;

void DivideString(const char *pInputStr, long lInputLen, char *pOutputStr); 
void DivideString2(const char *pInputStr, long lInputLen, char *pOutputStr); 
void DivideString3(const char *pInputStr, long lInputLen, char *pOutputStr); 
void main()
{
	char ch[50] = "abc def gh i        d";
	//char ch[50];
	//cin.getline(ch,50);
	char output[50];
	DivideString3(ch,strlen(ch),output);
	cout<<output<<endl;
}

//使用strtok函数的实现方式
void DivideString(const char *pInputStr, long lInputLen, char *pOutputStr)
{
	char* temp;
	char* word[10];
	char* input = const_cast<char*>(pInputStr);

	int index = 0;
	temp = strtok(input," ");
	while (temp != NULL)
	{
		word[index++] = temp;
		temp = strtok(NULL, " ");
	}

	for (int i = 0; i < index; i++)
	{
		if (i == 0)
		{
			//strncpy(pOutputStr,word[i],sizeof(word[i])+1);
			strcpy(pOutputStr,word[i]);
		}
		else
		{
			strcat(pOutputStr,",");
			strcat(pOutputStr,word[i]);
		}
	}
	strcat(pOutputStr,",");
}

//不适用strtok函数的实现方式
void DivideString2(const char *pInputStr, long lInputLen, char *pOutputStr)
{
	char* input = const_cast<char*>(pInputStr);
	char* temp = input;
	char* word[10];
	int index = 0;
	int length = 0;
	while (*input)
	{
		if (*input != ' ')
		{
			length++;
		    input++;
		}
		else
		{
			if (length != 0)
			{
				temp[length] = '\0';
				word[index++] = temp;
			}
			temp = input+1;
			length = 0;
			input++;
		}
	}

	for (int i = 0; i < index; i++)
	{
		if (i == 0)
		{
			strcpy(pOutputStr,word[i]);
		}
		else
		{
			strcat(pOutputStr,",");
			strcat(pOutputStr,word[i]);
		}
	}
	strcat(pOutputStr,",");
}

//直接法实现
void DivideString3(const char *pInputStr, long lInputLen, char *pOutputStr)
{
	const char* p = pInputStr;
	int count = 0;
	while (*p)
	{
		if (*p != ' ')
		{
			count = 0;
			*pOutputStr++ = *p++;
		}
		else
		{
			count++;
			if (count == 1)
			{
				*pOutputStr++ = ',';
			}
			p++;
		}
	}
	*pOutputStr++ = ',';
	*pOutputStr++ = '\0';
}

10 评委打分
问题描述:
在评委打分的比赛中,通常采取去掉一个最高分和最低分,再求平均分的做法,主要是为了公平,公正和公开的原则,防止有人买通评委,有特别的高分出现,另外,也可以防止因为评委个人原因,对选手有“低见”给特别低的分。去掉最高分最低分能够求出较为准确的平均分。请编写程序实现上述计分过程
要求实现函数:
intscore_calc(int n, int score[])
【输入】 int n,评委人数n(n>=3)
         int score[],每个评委的打分(百分制)
【输出】 无
【返回】 选手最终得分(取整)
注:
取整和四舍五入不同,取整只保留数值的整数部分,小数部分丢弃。比如7.3和7.6,取整后都为7
示例
输入:int n = 5;int score[] = {75, 80, 75, 70, 80}
输出:无
返回:76

#include <iostream>
using namespace std;

int score_calc(int n, int score[]);
void main()
{
	int n = 5;
	int score[] = {75, 80, 75, 70, 80};
	cout<<score_calc(5,score)<<endl;
}

int score_calc(int n, int score[])
{
	int max = score[0];
	int min = score[0];
	int sum = 0;
	for (int i = 0; i < n; i++)
	{
		if (score[i] > max)
		{
			max = score[i];
		}
		else if (score[i] < min)
		{
			min = score[i];
		}
		sum += score[i];
	}

	sum = (sum - max - min) / (n - 2);
	return sum;
}


目录
相关文章
|
Java
笔试题解答
/** * @author shishusheng * @date 2018/8/22 23:35 */ import java.util.
872 0
|
算法 机器学习/深度学习 BI
|
机器学习/深度学习