华为机试笔记

1.质数因子

先学习了一下如何c++ 数字与字符串的相互转换

首先推荐用用C++的stringstream。
主要原因是操作简单。

数字转字符串,int float类型 同理

#include 
#include 

int main(){
    double a = 123.32;
    string res;
    stringstream ss;
    ss << a;
    ss >> res;//或者 res = ss.str();
    return 0;
}

字符串转数字,int float类型 同理

int main(){
    string a = "123.32";
    double res;
    stringstream ss;
    ss << a;
    ss >> res;
    return 0;
}

上面方法的优点就是使用简单方便,确定可能会相对别的方法来说慢一点.

贴本题的code:


#include
#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;

string getResult(long data){
	string res = ""; string temp;
	while (data != 1)
	{
		for (int i = 2; i <= data; i++)
		{
			if (data%i == 0)
			{
				data /= i;
				//res +=i+'0';//只对一位数有效.超过两位数并非预期,例如11输出";"
				stringstream ss;
				ss << i;
				ss >> temp;
				res += temp;
				res += " ";
				break;//只要能被i整除,i总是从2开始
			}
		}
	}	
	return res;

}

int main(){
	long DInput;
	while (cin >> DInput)
	{
		cout << getResult(DInput) << endl;
	}
	return 0;
}

2.合并表记录

主要熟悉了C++ map遍历

	map<int, int> _map;
    map<int, int>::iterator iter;
    iter = _map.begin();
    while(iter != _map.end()) {
        cout << iter->first << " : " << iter->second << endl;
        iter++;
    }
 

本题code:


#include
#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;

void Merge(vector<pair<int, int>>res)
{
	map<int, int>M;
	for (int i=0; i < res.size(); i++)
	{
		M[res[i].first]+=res[i].second;
	}
	map<int, int>::iterator iter=M.begin();
	while (iter!=M.end())
	{
		cout << iter->first << " " << iter->second << endl;
		iter++;
	}

}

int main(){
	int n; vector<pair<int, int>> res;
	while (cin>>n)
	{
		while (n--)
		{
			int a, b;
			cin >> a >> b;			
			res.push_back(make_pair(a, b));
		}
		Merge(res);
	}
	return 0;
}

3.[中级]单词倒排

这个函数还是用的不熟,string substr (size_t pos = 0, size_t len = npos) const;
substr
s.substr(begin, end-begin);第一个是起始位置,第二个代表是长度。


#include
#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;


void RevStr(string &s, int l, int r)
{
	while (l<r)
	{
		swap(s[l++], s[r--]);
	}
}

string ReverseHelp(string s){
	string res = "";
	//预处理 非构成单词的字符均视为单词间隔符
	for (int i = 0; i < s.length();i++)
	if ((s[i] >= 'a'&&s[i] <= 'z') || (s[i] >= 'A'&&s[i] <= 'Z'))
		continue;
	else
		s[i] = ' ';
	//去除前后空格
	int i = 0, j = s.length() - 1;
	while (i < s.length() && s[i] == ' ')i++;
	while (j >=0 && s[j] == ' ')j--;
	s = s.substr(i, j - i+1);
	RevStr(s, 0, s.length() - 1);
	int begin = 0, end = 0;
	while (begin<s.length() && end<s.length())
	{
		while (end < s.length() && s[end] == ' ')end++;//跳过空格
		begin = end;
		while (end < s.length() && s[end] != ' ')end++;//寻找下一个空格
		RevStr(s, begin, end - 1);
		res += s.substr(begin, end-begin);
		res +=' ';		
	} 

	return res.substr(0,res.length()-1);
}

int main(){
	string s;
	while (getline(cin,s))//不能使用cin>>s;使用getline可以把空格当作字符串一部分
	{
		cout << ReverseHelp(s);
	} 
	return 0;
}

你可能感兴趣的:(面试笔记)