c++华为面试题--牛客网-3.0

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/SLAM_masterFei/article/details/90340081

越做越觉得非科班出身的艰难。。。要不还是老老实实画图去?

好吧 再来一题:给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。 
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。 
给出多个名字,计算每个名字最大可能的“漂亮度”

这个就是简单的循环归类。。。找出每个字符串相同字符的个数,来看代码

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;


int main()
{
	int num;
	while (cin >> num)
	{
		string str;
		vector<string> vec;
		vector<int> vec1;
		vector<int> vec2;
		for (int i = 0; i < num; i++)
		{
			cin >> str;
			vec.push_back(str);
		}
		for (int i = 0; i < vec.size(); i++)
		{
			vec1.clear();
			int sum = 0;
			for (char j = 'a'; j <= 'z'; j++)
			{
				int n = 0;
				for (int k = 0; k < vec[i].size(); k++)
				{
					if (j == vec[i][k])
					{
						n++;
					}
				}
				vec1.push_back(n);
			}
			sort(vec1.begin(), vec1.end());
			int s = 26;
			for (int j = vec1.size() - 1; j >= 0; j--)
			{
				sum += s*vec1[j];
				s--;
			}
			vec2.push_back(sum);
		}
		for (int i = 0; i < vec2.size(); i++)
		{
			cout << vec2[i] << endl;
		}
	}
	return 0;
}

 

来看这题:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF"6,应该输出为"我ABC"而不是"我ABC+汉的半个"。 

这题其实只要用直接输出就行,因为字符串会自动判断是不是半个字节的问题

#include<iostream>
#include<string>
using namespace std;


int main()
{
	int n;
	string str;
	while (cin >> str)
	{
		cin >> n;
		int num = 0;
		while (n)
		{
			cout << str[num];
			num++;
			n--;
		}
		cout << endl;
	}
	return 0;
}

来看这一题,输出7有关数字的个数,包括7的倍数,还有包含7的数字(如17,27,37...70,71,72,73...)的个数(一组测试用例里可能有多组数据,请注意处理) 比较简单,来看代码:

#include<iostream>
#include<vector>
using namespace std;


int main()
{
	int num;
	while (cin >> num)
	{
		vector<int> vec;
		int n = 0;
		for (int i = 1; i <= num; i++)
		{
			vec.clear();
			if (i % 7 == 0)
			{
				n++;
				continue;
			}
			else
			{
				int k = i;
				while (k)
				{
					vec.push_back(k % 10);
					k = k / 10;
				}
				for (int j = 0; j < vec.size(); j++)
				{
					if (vec[j] == 7)
					{
						n++;
						break;
					}
				}
			}
		}
		cout << n << endl;
	}
	return 0;
}

再来一题:

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。

例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。

给定函数count(int n),用于计算n以内(含n)完全数的个数。计算范围, 0 < n <= 500000

返回n以内完全数的个数。 异常情况返回-1 来看代码:

#include<iostream>
#include<vector>
using namespace std;


int main()
{
	int num;
	while (cin >> num)
	{
		int n = 0;
		for (int i = 1; i <= num; i++)
		{
			vector<int> vec;
			for (int j = 1; j < i; j++)
			{
				if (i%j == 0)
				{
					vec.push_back(j);
				}
			}
			int sum = 0;
			for (int j = 0; j < vec.size(); j++)
			{
				sum += vec[j];
			}
			if (sum == i)
			{
				n++;
			}
		}
		cout << n << endl;
	}
	return 0;
}

来看到弱智题  输入n个整数,输出其中最小的k个。来看代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() 
{
	int a, b;
	while (cin >> a >> b)
	{
		vector<int> vec;
		for (int i = 0; i < a; i++)
		{
			int n;
			cin >> n;
			vec.push_back(n);
		}
		sort(vec.begin(), vec.end());
		for (int i = 0; i < b; i++)
		{
			if (i != b - 1)
			{
				cout << vec[i]<<" ";
			}
			else
			{
				cout << vec[i] << endl;
			}
		}
	}
	
	return 0;
}

来看下一题

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() 
{
	string str;
	while (cin >> str)
	{
		int n;
		for (int i = 0; i < str.size(); i++)
		{
	        n = 0;
			for (int j = 0; j < str.size(); j++)
			{
				if (str[i] == str[j])
				{
					n++;
				}
			}
			if (n == 1)
			{
				cout << str[i] << endl;
				break;
			}
		}
		if (n > 1)
		{
			cout << -1 << endl;
		}
	}
	return 0;
}

再来看一题:任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对 来看代码

#include<iostream>
using namespace std;
int main() 
{
	int num;
	while (cin >> num)
	{
		int ifok = 0;
		for (int i = num / 2; i > 0; i--)
		{
			if (i > 2)
			{
				int n = 2;
				for (int k = 2; k < i; k++)
				{
					n++;
					if (i%k == 0)
					{
						break;
					}
				}
				if (n == i)
				{
					int m = 2;
					for (int k = 2; k < num - i; k++)
					{
						m++;
						if ((num - i) % k == 0)
						{
							break;
						}
					}
					if (m == num - i)
					{
						ifok = 1;
						cout << i << endl;
						cout << num - i << endl;

					}
				}
				if (ifok == 1)
				{
					break;
				}
			}
			else
			{
				cout << i << endl;
				cout << num - i << endl;
			}
		}
	}
	
	return 0;
}

再来一题 计算整数二进制中1的个数 题目比较简单 参考代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
	int n1;
	while (cin >> n1)
	{
		vector<int> vec;
		int sum = 0;
		while (n1)
		{
			int n = n1 % 2;
			vec.push_back(n);
			n1 = n1 / 2;
		}
		for (int i = 0; i < vec.size(); i++)
		{
			if (vec[i] == 1)
			{
				sum++;
			}
		}
		cout << sum << endl;
	}	
	return 0;
}

来看这一题:

一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。

给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列。

题目比较简单,需要截取字符串函数substr来看具体代码

#include<iostream>
#include<string>
using namespace std;

int main()
{
	string str;
	int num;
	while (cin >> str)
	{
		cin >> num;
		double rate = 0;
		string res;
		for (int i = 0; i < str.size() - num + 1; i++)
		{
			int sum = 0;
			string str1 = str.substr(i, num);
			for (int k = 0; k < str1.size(); k++)
			{
				if (str1[k] == 'G' || str1[k] == 'C')
				{
					sum++;
				}
			}
			double currate = sum / double(num);
			if (currate > rate)
			{
				rate = currate;
				res = str1;
			}
		}
		cout << res << endl;
	}
	return 0;
}

再来一题,不得不说一句,往后走热度越少,我觉得虽天赋很重要,凡事还是贵在坚持。。。好了来看这题

这题的关键在于定位是哪首歌以及歌出现的位置,来看代码:

#include<iostream>
#include<string>
using namespace std;

int main()
{
	int num;
	string str;
	while (cin >> num)
	{
		cin >> str;
		if (num > 4)
		{
			int ini = 1;
			int locate = 1;
			for (int i = 0; i < str.size(); i++)
			{
				if (str[i] == 'U')
				{
					if (ini == 1)
					{
						ini = num;
						locate = 4;
					}
					else
					{
						ini = ini - 1;
						locate -= 1;
						if (locate == 0)
						{
							locate+=1;
						}
					}
				}
				else if (str[i] == 'D')
				{
					if (ini == num)
					{
						ini = 1;
						locate = 1;
					}
					else
					{
						ini = ini + 1;
						locate += 1;
						if (locate == 5)
						{
							locate-=1;
						}
					}
				}
			}
			if (locate == 1)
			{
				cout << ini << " " << ini + 1 << " " << ini + 2 << " " << ini + 3 << endl;
				cout << ini << endl;
			}
			else if (locate == 2)
			{
				cout << ini - 1 << " " << ini << " " << ini + 1 << " " << ini + 2 << endl;
				cout << ini << endl;
			}
			else if (locate == 3)
			{
				cout << ini - 2 << " " << ini - 1 << " " << ini << " " << ini + 1 << endl;
				cout << ini << endl;
			}
			else if (locate == 4)
			{
				cout << ini - 3 << " " << ini - 2 << " " << ini - 1 << " " << ini << endl;
				cout << ini << endl;
			}
		}
		else
		{
			int ini = 1;
			int locate = 1;
			for (int i = 0; i < str.size(); i++)
			{
				if (str[i] == 'U')
				{
					if (ini == 1)
					{
						ini = num;
					}
					else
					{
						ini = ini - 1;
					}
				}
				else if (str[i] == 'D')
				{
					if (ini == num)
					{
						ini = 1;
					}
					else
					{
						ini = ini + 1;
					}
				}
			}
			for (int i = 1; i <= num; i++)
			{
				if (i != num)
				{
					cout << i << " ";
				}
				else
				{
					cout << i << endl;
				}
			}
			cout << ini << endl;
		}
	}
	return 0;
}

再来看一题:查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个

这题比较简单 我的思路是先找到起始位置相同的,然后开始自增,比较,返回。来看代码

#include<iostream>
#include<string>
using namespace std;




int main()
{
	string str1, str2;
	while (getline(cin, str1))
	{
		getline(cin, str2);
		if (str1.size() > str2.size())
		{
			string cur = str2;
			str2 = str1;
			str1 = cur;
		}
		int max = 0;
		string str;
		for (int i = 0; i < str1.size(); i++)
			for (int j = 0; j < str2.size(); j++)
			{
				if (str1[i] == str2[j])
				{
					int k = 0;
					while (str1[i + k] == str2[j + k] && (i + k)<str1.size() && (j + k)<str2.size())
					{
						k++;
					}
					if (max < k)
					{
						max = k;
						str = str1.substr(i, k);
					}
				}
			}
		cout << str << endl;
	}
	return 0;
}

周末了,做一道弱智题轻松下,公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何? 来看代码:

#include<iostream>
using namespace std;

int main() 
{
	int num;
	while (cin >> num)
	{
		for (int i = 0; i <= 20; i++)
			for (int j = 0; j <= 33; j++)
				for (int k = 0; k <= 300; k = k + 3)
				{
					if (i * 5 + j * 3 + k / 3 == 100 && i + j + k == 100)
					{
						cout << i << " " << j << " " << k << endl;
					}
				}
	}
	return 0;
}

来看这一题:

根据输入的日期,计算是这一年的第几天。。

详细描述:

输入某年某月某日,判断这一天是这一年的第几天?。 参考代码:

#include<iostream>
#include<stdlib.h>
using namespace std;

int main() 
{
	int a, b, c;
	while (cin >> a)
	{
		int num = 0;
		cin >> b >> c;
		int mon[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
		if (a % 4 == 0)
		{
			mon[1] = 29;
			for (int i = 0; i < b-1; i++)
			{
				num += mon[i];
			}
			num += c;
		}
		else
		{
			mon[1] = 28;
			for (int i = 0; i < b-1; i++)
			{
				num += mon[i];
			}
			num += c;
		}
		cout << num << endl;
	}
	return 0;
}

来看这一题,其实做多了感觉很多都是大同小异      计算两个字符串的最大公共字串的长度,字符不区分大小写

来看代码:

#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;


int main() 
{
	string str1, str2;
	while (cin >> str1 >> str2)
	{
		int num = 0;
		for (int i = 0; i < str1.size(); i++)
		{
			if (str1[i] >= 'A'&&str1[i] <= 'Z')
			{
				str1[i] += 32;
			}
		}
		for (int i = 0; i < str2.size(); i++)
		{
			if (str2[i] >= 'A'&&str2[i] <= 'Z')
			{
				str2[i] += 32;
			}
		}
		for (int i = 0; i < str1.size(); i++)
		{
			for (int j = 0; j < str2.size(); j++)
			{
				if (str1[i] == str2[j])
				{
					int n = 0;
					int k = i, w = j;
					while (str1[k] == str2[w] && k<str1.size() && w<str2.size())
					{
						k++;
						w++;
						n++;
					}
					if (num < n)
					{
						num = n;
					}
				}
			}
		}
		cout << num;
	}
	return 0;
}

 

展开阅读全文

没有更多推荐了,返回首页