小米服务端编程
发布于 2017-09-18 22:04 1956 次浏览 0 赞 来自 笔试面试  

第一题是my.ABC转化为_MY_ABC_之类的

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

#define MAXLEN 1000

void trans(string input)
{
	if(input.size() <= 0)
		return;
	char res[MAXLEN];
	res[0]='_';
	int k=1;
	for(int i=0; i<input.size(); i++)
	{
		if(input[i]>='a'&&input[i]<='z')
		{
			if(i>0&&input[i-1]>='0'&&input[i-1]<='9')
			{
				res[k++]='_';
				res[k++]=input[i]-32;
			}
			else
			{
				res[k++]=input[i]-32;
			}
		}
		else if(input[i]>='A'&&input[i]<='Z')
		{
			if(i>0&&input[i-1]>='A'&&input[i-1]<='Z')
			{
				if(i<=input.size()-2&&input[i+1]>='a'&&input[i+1]<='z')
				{
					res[k++]='_';
					res[k++]=input[i];
				}
				else
				{
					res[k++]=input[i];
				}
			}
			if(i==0)
			{
				res[k++]=input[i];
			}
			if(i>0&&!(input[i-1]>='A'&&input[i-1]<='Z'))
			{
				if(input[i-1]=='.')
				{
					res[k++]=input[i];
				}
				else
				{
					res[k++]='_';
					res[k++]=input[i];
				}
			}
		}
		else if(input[i]>='0'&&input[i]<='9')
		{
			if((i>0&&(input[i-1]=='.'||input[i-1]>='0'&&input[i-1]<='9')) || i==0)
			{
				res[k++]=input[i];
			}
			else
			{
				res[k++]='_';
				res[k++]=input[i];
			}
		}
		else if(input[i]=='.')
		{
			res[k++]='_';
		}
	}
	if(res[k-1]!='_')
		res[k++]='_';
	res[k]='\0';
	string ans(res);
	cout << ans << endl; 
}

int main()
{
	string input;
	while(cin>>input)
	{
		trans(input);
	}
	return 0;
}

第二题是路径匹配输出最大匹配ID,做的时候那个输入坑了我好一会,搞到我没法ac

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

vector<int> getRes(vector<string> src, vector<string> pattern, map<string, int> mymap)
{
	vector<int> res;
	for(int i=0; i<pattern.size(); i++)
	{
		int max = 0;
		for(int j=0; j<src.size(); j++)
		{
			int begin = -1;
			if((begin=pattern[i].find(src[j]))!=string::npos)
			{
				if(begin==0&&begin+src[j].size()<=pattern[i].size()-1&&pattern[i][begin+src[j].size()]=='/'||begin+src[j].size()>=pattern[i].size())
				{
					if(max<mymap[src[j]])
						max = mymap[src[j]];
				}
			}
		}
		res.push_back(max);
	}
	return res;
}

int main()
{
	vector<string> src;
	vector<string> pattern;
	map<string, int> mymap;
	string tmp;
	int flag=1;
	while(cin>>tmp)
	{
		if(tmp!="-")
		{
			if(flag==1)
			{
				int tmp2;
				cin >> tmp2;
				src.push_back(tmp);
				mymap[tmp]=tmp2;
			}
			else
			{
				pattern.push_back(tmp);
			}
		}
		else
		{
			flag=2;
		}	
	}
	
	vector<int> res = getRes(src, pattern, mymap);
	for(int i=0; i<res.size(); i++)
		cout << res[i] << endl;
	return 0;
}

第三题是密码破译,没时间做,考试结束后搞出来了一个解法

#include <bits/stdc++.h>
using namespace std;

int char2int(char c)
{
    return c-'0';
}

void dfs(const string& s, int start, vector<string>& ans, string& path)
{
    if(start == s.length())
    {
        ans.push_back(path);
        return;
    }
//    for(size_t i  = start; i < s.length(); ++i)
//    {
        int i = start;
        char ch;
        if(i < s.length() - 1)
        {
            int num = char2int(s[i])*10 + char2int(s[i+1]);
            if(num <= 26)
            {
                ch = 'a' + num - 1;
                //cout << step++ << " start = "<< start << " ch1 = " << ch << endl;
                path.push_back(ch);
                dfs(s, i+2, ans, path);
                path.pop_back();

            }
            ch  ='a' + char2int(s[i]) - 1;
            //cout << step++ << " start = "<< start << " ch2 = " << ch << endl;
            path.push_back(ch);
            dfs(s, i+1, ans, path);
            path.pop_back();

        } else {
            ch = 'a' + char2int(s[i]) - 1;
            //cout << step++ << " start = "<< start << " ch3 = " << ch << endl;
            path.push_back(ch);
            dfs(s, i+1, ans, path);
            path.pop_back();
        }
    //}
}



vector<string> fun(string& s)
{
    vector<string> ans;
    string path;
    dfs(s, 0, ans, path);
    sort(ans.begin(), ans.end());
    return ans;
}



int main(){
	string num;
	while(cin >> num)
    {
        vector<string> ans = fun(num);
        for(auto i : ans)
            cout << i <<" ";
        cout << endl;
    }
	return 0;
}

我想问一个问题,为啥客户端开发的编程输入输出都搞好了,只需要像leetcode那种写个函数就行了,服务端整这么一出,尤其是第二题。

2 条回复
回朔法,leedcode IP restore 变形。

#include<iostream>

#include<vector>

#include<algorithm>

#include<string>

using namespace std;


void DFS(string &s, string path, vector<string>&res, int pos)

{

if (pos >= s.size())

{

res.push_back(path);

return;

}

for (int i = pos; i < pos + 2 && i < s.size(); i++)

{

string tmp = s.substr(pos, i - pos + 1);

int  num = stoi(tmp);

if (num > 26)return;

//path = path + (char)(num + 96);

DFS(s, path + (char)(num + 96), res, i + 1);

}

}

int main()

{

string s;

cin >> s;

string path;

vector<string>res;

DFS(s, path, res, 0);

sort(res.begin(), res.end());

for (int i=0;i<res.size();i++)

{

cout << res[i] << " ";

}

return 0;

}


2017-09-18 22:10

牛逼,我自己想想再

2017-09-19 03:31
添加回复
回到顶部