2020/4/11 网易游戏后台开发笔试,4道编程题

好像不同的岗位做的题也不一样,我报的是后台开发,做了下面四题。第一题ac,第二题40%,第三题没做,第四题70%
1.九进制加法
2.聪明的厂长
3.组队
4.整理快递盒
---------------------------------------------------------------------------
第一题


我的C++解法:
class Solution {
public:
	/**
	* 接收两个表示9进制数的字符串,返回表示它们相加后的9进制数的字符串
	* @param num1 string字符串 第一个加数
	* @param num2 string字符串 第二个加数
	* @return string字符串
	*/
	string add(string num1, string num2) {
		string s1, s2, z1, z2;
		s1 = findSmallPart(num1);
		s2 = findSmallPart(num2);
		z1 = findZhengPart(num1);
		z2 = findZhengPart(num2);
		int rest = 0;
		string small = handleSmallPart(s1, s2, rest);
		string zheng = handleZhengPart(z1, z2, rest);
		if (small.size() == 0) {
			return zheng;
		}
		return zheng + '.' + small;
	}

	char itos(int i) { // 将int 转换成 char
		stringstream s;
		string str;
		s << i;
		str = s.str();
		return str[0];
	}

	string handleZhengPart(string z1, string z2, int rest) {
		// 处理成等长
		if (z1.size() != z2.size()) {
			if (z1.size() > z2.size()) {
				while (z1.size() > z2.size()) { z2.insert(0, 1, '0'); }
			}
			else if (z2.size() > z1.size()) {
				while (z2.size() > z1.size()) { z1.insert(0, 1, '0'); }
			}
		}
		string tmp(z1.size(), '0');
		if (z1.size() != z2.size()) { cout << "mark2" << endl; return tmp; }
		for (int i = z1.size() - 1; i >= 0; --i) {
			int x1 = z1[i] - '0';
			int x2 = z2[i] - '0';
			int sum = x1 + x2 + rest;
			if (sum < 9) {
				tmp[i] = itos(sum);
				rest = 0;
			}
			else {
				tmp[i] = itos(sum - 9);
				rest = 1;
			}
		}
		if (rest != 0) {
			tmp.insert(0, 1, itos(rest));
		}
		return tmp;
	}

	string handleSmallPart(string s1, string s2, int& rest) {
		if (s1.size() == 0 && s2.size() == 0) {
			return "";
		}
		// 处理成等长
		if (s1.size() != s2.size()) {
			if (s1.size() > s2.size()) {
				while (s1.size() > s2.size()) { s2 += '0'; }
			}
			else if (s2.size() > s1.size()) {
				while (s2.size() > s1.size()) { s1 += '0'; }
			}
		}
		string tmp(s1.size(), '0');
		if (s1.size() != s2.size()) { cout << "mark1" << endl; return tmp; }
		for (int i = s1.size() - 1; i >= 0; --i) {
			int x1 = s1[i] - '0';
			int x2 = s2[i] - '0';
			int sum = x1 + x2 + rest;
			if (sum < 9) {
				tmp[i] = itos(sum);
				rest = 0;
			}
			else {
				tmp[i] = itos(sum - 9);
				rest = 1;
			}
		}
		return tmp;
	}

	string findSmallPart(string num) {
		string tmp;
		int pointPos = -1;
		for (size_t i = 0; i < num.size(); ++i) {
			if (num[i] == '.') {
				pointPos = i;
				break;
			}
		}
		if (pointPos == -1) {
			return tmp;
		}
		for (size_t i = pointPos + 1; i < num.size(); ++i) {
			tmp += num[i];
		}
		return tmp;
	}

	string findZhengPart(string num) {
		string tmp;
		int pointPos = -1;
		for (size_t i = 0; i < num.size(); ++i) {
			if (num[i] == '.') {
				pointPos = i;
				break;
			}
		}
		if (pointPos == -1) {
			return num;
		}
		for (int i = 0; i < pointPos; ++i) {
			tmp += num[i];
		}
		return tmp;
	}

};

int main() {
	Solution sss;
	string num1 = "1.28";
	string num2 = "1.71";
	cout << sss.add(num1, num2) << endl;
	system("pause");
}


-------------------------------------------------------------------------
第二题


我用回溯法做的,通过40%,超时了。应该是可以继续剪枝,我不知道该怎么写了,希望评论区有大佬告知。
void DFS(vector<int> workPower, vector<int> staffHard, int worker, vector<int> hasDone, int& count) {
	if (hasDone.size() == staffHard.size()) {
		++count;
		return;
	}
	for (size_t i = 0; i < staffHard.size(); ++i) {
		if (workPower[worker] < staffHard[i] || find(hasDone.begin(), hasDone.end(), i) != hasDone.end()) {
			continue;
		}
		hasDone.push_back(i);
		DFS(workPower, staffHard, worker + 1, hasDone, count);
		hasDone.pop_back();
	}
}

int main() {
	int n, m;
	cin >> n;
	vector<int> workPower(n);
	vector<int> staffHard(n);
	for (int i = 0; i < n; ++i) {
		cin >> workPower[i];
	}
	for (int i = 0; i < n; ++i) {
		cin >> staffHard[i];
	}
	cin >> m;
	
	sort(workPower.begin(), workPower.end());
	sort(staffHard.begin(), staffHard.end());
	for (int i = 0; i < n; ++i) {
		if (workPower[i] < staffHard[i]) {
			cout << 0 << endl;
			//system("pause");
			return 0;
		}
	}

	vector<int> hasDone;
	int count = 0;
	DFS(workPower, staffHard, 0, hasDone, count);
	cout << count % m << endl;
	//system("pause");
	return 0;
}

------------------------------------------------------------------------
第三题,我没做,题目都很难看懂,不愧是游戏公司,出题都这么游戏化


----------------------------------------------------------------------------
第四题


我先将所有盒子按某一尺度(长宽高、体积)进行排序,然后从大到小遍历所有盒子,看能不装下前面更小的盒子。通过70%
我这方法纯属硬凑,希望有大佬解惑

class Solution {
public:
	/**
	*
	* @param boxes int整型二维数组
	* @param boxesRowLen int boxes数组行数
	* @param boxesColLen int* boxes数组列数
	* @return int整型
	*/
	int maxBoxes(int** boxes, int boxesRowLen, int* boxesColLen) {
		// 转为vector
		vector<vector<int> > Boxes;
		int row = boxesRowLen, col = *boxesColLen;
		for (int i = 0; i < row; ++i) {
			vector<int> rowTmp;
			for (int j = 0; j < col; ++j) {
				rowTmp.push_back(boxes[i][j]);
			}
			Boxes.push_back(rowTmp);
		}
		// 1
		sort(Boxes.begin(), Boxes.end(), sortByL);
		vector<int> bigBox = Boxes.back();
		int count1 = 1;
		for (int i = Boxes.size() - 2; i >= 0; --i) {
			if (leftContainRight(bigBox, Boxes[i])) {
				++count1;
				bigBox = Boxes[i];
			}
		}
		// 2
		sort(Boxes.begin(), Boxes.end(), sortByW);
		bigBox = Boxes.back();
		int count2 = 1;
		for (int i = Boxes.size() - 2; i >= 0; --i) {
			if (leftContainRight(bigBox, Boxes[i])) {
				++count2;
				bigBox = Boxes[i];
			}
		}
		// 3
		sort(Boxes.begin(), Boxes.end(), sortByH);
		bigBox = Boxes.back();
		int count3 = 1;
		for (int i = Boxes.size() - 2; i >= 0; --i) {
			if (leftContainRight(bigBox, Boxes[i])) {
				++count3;
				bigBox = Boxes[i];
			}
		}
		// 4
		sort(Boxes.begin(), Boxes.end(), sortByV);
		bigBox = Boxes.back();
		int count4 = 1;
		for (int i = Boxes.size() - 2; i >= 0; --i) {
			if (leftContainRight(bigBox, Boxes[i])) {
				++count4;
				bigBox = Boxes[i];
			}
		}
		int count = max(max(max(count1, count2), count3), count4);
		return count;
	}

	static bool sortByL(const vector<int>& b1, const vector<int>& b2) {
		return b1.front() < b2.front();
	}

	static bool sortByW(const vector<int>& b1, const vector<int>& b2) {
		return b1[1] < b2[1];
	}

	static bool sortByH(const vector<int>& b1, const vector<int>& b2) {
		return b1[2] < b2[2];
	}

	static bool sortByV(const vector<int>& b1, const vector<int>& b2) {
		return b1[0]*b1[1]*b1[2] < b2[0] * b2[1] * b2[2];
	}

	static bool leftContainRight(const vector<int>& b1, const vector<int>& b2) {
		if (b1.size() != 3 || b2.size() != 3) {
			cout << "Wrong data!" << endl;
			return false;
		}
		if (b2[0] < b1[0] && b2[1] < b1[1] && b2[2] < b1[2]) {
			return true;
		}
		else {
			return false;
		}
	}

};















#网易互娱2021届实习#
全部评论
差点给我难哭了😢100 20 0 40
2 回复
分享
发布于 2020-04-11 21:55
前端也是这个题
1 回复
分享
发布于 2020-04-11 21:45
博乐游戏
校招火热招聘中
官网直投
第二题 100% #include <bits/stdc++.h> using namespace std; int main() {     int n,m;     cin >> n;     vector<int> wvec(n,0);     vector<int> tvec(n,0);     for(int i = 0; i < n; ++i) {         cin >> wvec[i];     }     for(int i = 0; i < n; ++i) {         cin >> tvec[i];     }     cin >> m;     sort(wvec.begin(),wvec.end());     sort(tvec.begin(),tvec.end());     long long res = 1;     for(int i = 0; i < n; ++i) {         auto pos = upper_bou***ec.begin(),tvec.end(), wvec[i]);         res *= (pos-tvec.begin()-i);         res%=m;     }     cout << res; }
点赞 回复
分享
发布于 2020-04-11 21:54
第三题一样没看懂,直接过了。 第四题我用dp过了80%,感觉是最长升序子序列的模板。 九进制的题没AC,心态崩了😓
点赞 回复
分享
发布于 2020-04-11 21:58
第四题按长宽高排序然后从小到大
点赞 回复
分享
发布于 2020-04-11 22:00

相关推荐

点赞 22 评论
分享
牛客网
牛客企业服务