交流-华为优招第二批次程序分享【C++】

第一题:括号匹配
栈的经典应用。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

bool isLeft(char a)
{
	return (a == '(') || (a == '[') || (a == '{');
}

bool isRight(char a)
{
	return (a == ')') || (a == ']') || (a == '}');
}

bool isMatch(char a, char b)
{
	if(a == '('&&b == ')')
	{
		return true;
	}
	else if(a == '['&&b == ']')
	{
		return true;
	}
	else if(a == '{'&&b == '}')
	{
		return true;
	}
	return false;
}

int main()
{
#if 1
	freopen("ini.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
#endif
	string str;
	vector<char> cvec;
	cvec.reserve(200);
	while(cin >> str)
	{
		auto iter = str.begin();
		for(; iter != str.end(); ++iter)
		{
			if(isLeft(*iter))
			{
				cvec.push_back(*iter);
			}
			else if(isRight(*iter) && !cvec.empty())
			{
				char c = cvec.back();
				cvec.pop_back();
				if(!isMatch(c, *iter))
				{
					break;
				}
			}
			else if(isRight(*iter) && cvec.empty())
			{
				break;
			}
		}
		if(iter != str.end() || !cvec.empty())
		{
			cout << "false" << endl;
		}
		else
		{
			cout << "true" << endl;
		}
	}

	return 0;
}

第二题:打印机任务
弱智了,看到了输出的‘,’,却忽略输入的’,‘   郁闷,当我意识到这个问题,就只剩一分钟,加了一个char c;
一道对c++有利的题,就这么让我给放了。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

#define MAX  500

int input[MAX];

struct QNode
{
	int num;
	int idx;
};

typedef struct Que
{
	QNode* elem;
	int front;
	int rear;
	int len;
	int sz;
}CyQueue;

void initQueue(CyQueue& Q)
{
	Q.front = Q.rear = 0;
	Q.len = Q.sz = 0;
	Q.elem = nullptr;
}

bool isEmpty(CyQueue Q)
{
	return Q.len == 0;
}

int nextIdx(CyQueue Q, int cur)
{
	return (cur + 1) % (Q.sz + 1);
}

//Q 非空
int getMax(CyQueue Q)
{
	int maxNum = Q.front;
	int i = nextIdx(Q, Q.front);
	for(; i != Q.rear; i = nextIdx(Q, i))
	{
		if(Q.elem[i].num > Q.elem[maxNum].num)
		{
			maxNum = i;
		}
	}
	return maxNum;
}

void Pop(CyQueue& Q)
{
	Q.front = nextIdx(Q, Q.front);
	--Q.len;
}

QNode getFront(CyQueue& Q)
{
	return Q.elem[Q.front];
}

void Push(CyQueue& Q, QNode& q)
{
	Q.elem[Q.rear] = q;
	Q.rear = nextIdx(Q, Q.rear);
	++Q.len;
}

void printOrder(const int input[], int len, int output[])
{
	CyQueue Q;
	//vector<int> ivec;
	initQueue(Q);
	Q.len = len;
	Q.sz = len + 1;
	Q.elem = new QNode[len + 1];
	for(int i = 0; i < len; ++i)
	{
		Q.elem[i].num = input[i];
		Q.elem[i].idx = i;
	}
	Q.front = 0;
	Q.rear = Q.sz;
	int numOut = 0;
	while(!isEmpty(Q))
	{
		int pos = getMax(Q);
		for(int i = Q.front; i != pos; i = nextIdx(Q, i))
		{
			QNode q = getFront(Q);
			Pop(Q);
			Push(Q, q);
		}

		QNode q = getFront(Q);
		output[numOut++] = q.idx;
		//ivec.push_back(q.idx);
		Pop(Q);
	}
	/*for(auto i : ivec)
	{
	cout << i << " ";
	}*/
}



int main()
{
#if 0
	freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
#endif
	int len = 0;
	int num;
	char c;
//提交的是while(cin>>num>>c){input[len++]=num;}
	while(cin >> num)
	{
		cin >> c;
		input[len++] = num;
	}
	//const int input[3] = {9, 3, 5};
	//int len = 3;
	int output[MAX] = {0};
	printOrder(input, len, output);

	for(int i = 0; i < len - 1; ++i)
	{
		cout << output[i] << ", ";
	}
	cout << output[len - 1];
	return 0;
}

第三题:平安果
用的递归,过了全部案例。预计过所有案例时,够呛。时间花在第二题,有啥思路立马上了。坑了,全部案例,递归栈肯定爆了;

#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <iostream>

using namespace std;

int getAppleIn(vector<vector<int> >& ivec, int m, int n, int row, int col)
{
	if(row >= m||col >= n)
	{
		return 0;
	}
	else if(row == m - 1)
	{
		int sum = 0;
		for(int i = col; i < n; ++i)
		{
			sum += ivec[row][i];
		}
		return sum;
	}
	else if(col == n - 1)
	{
		int sum = 0;
		for(int i = row; i < m; ++i)
		{
			sum += ivec[i][col];
		}
		return sum;
	}
	else
	{
		int sum = ivec[row][col];
		int sum1 = getAppleIn(ivec, m, n, row + 1, col);
		int sum2 = getAppleIn(ivec, m, n, row, col + 1);
		return sum + (sum1 < sum2 ? sum2 : sum1);
	}
}

int getApple(vector<vector<int> >& ivec, int m, int n)
{
	int sum = getAppleIn(ivec, m, n, 0, 0);
	return sum;
}

int main()
{
#if 0
	freopen("in.txt", "r", stdin);
#endif
	int m, n;
	vector<vector<int>> ivec;
	while(cin >> m >> n)
	{
		for(int i = 0; i < m; ++i)
		{
			vector<int> tem;
			for(int j = 0; j < n; ++j)
			{
				int num;
				cin >> num;
				tem.push_back(num);
			}
			ivec.push_back(tem);
		}
		int res = getApple(ivec, m, n);
		cout << res;
	}
	return 0;
}

#华为##C++工程师#
全部评论
# 我是拿python刷的题,没有用C++, 代码思路供参考 # 具体思路就是把python list中每个元素的index也建成一个list, # 然后每当元素后移时,index也跟着移动,得到两个新的list, # 一个存放list中的元素,另一个存放index, # 这样无论怎么元素怎么移动,都能追踪到它的位置。 # 以[9,3,5] 为例,输出结果为[0,2,1] # 以[9,3,5,3]为例,输出结果为[0,3,1,2] # 如果你代码可以处理这两种情况,应该就可以全部通过了。 # python读取时需要','来split() # 输出时需要' ,'.join()来输出(注:输出是空格加逗号) def printIndex(listx):     length = len(listx)     index_list = range(length)     order_dict = {}     i = 0     while i<length:         if listx[i] == max(listx[i:]):             order_dict[index_list[i]] = i             i += 1         else:             listx = listx[:i]+listx[i+1:]+[listx[i]]             index_list = index_list[:i]+index_list[i+1:]+[index_list[i]]     return_list = []     for i in range(length):         return_list.append(order_dict[i])     return return_list listX = map(int,raw_input().split(',')) print ' ,'.join(map(str,printIndex(listX)))
点赞 回复 分享
发布于 2017-07-13 10:19
打印机任务具体是啥
点赞 回复 分享
发布于 2017-07-12 21:40
第二题你过了多少?
点赞 回复 分享
发布于 2017-07-12 21:43
第二道题不是因为输入有逗号吧,我输入输出都有逗号,在本机上可以过的,但是OJ还是不对。有人说是因为输出除了“,”,还有空格。😳
点赞 回复 分享
发布于 2017-07-12 21:52
第三题可以用动态规划,直接考虑当前左边和上边累计的较大值即可。 我觉得第二题很多地方没有说清楚,而且既然是void函数为何还有output[]这个参数。。。 更奇怪的是第二题我的代码第一次过了60%, 然后一个字没改第二次就变成40%了。。。。
点赞 回复 分享
发布于 2017-07-12 21:58
第二题的输出需要空格加等号就可以全部通过了
点赞 回复 分享
发布于 2017-07-12 22:10
第二题用JAVA写挺简单的,AC了
点赞 回复 分享
发布于 2017-07-13 10:23
第二个我的思路是对优先级和这个任务的输入的下标组合起来进行稳定排序,按照优先级从大到小,然后将排序结果中的下标输入,不过只通过了60%
点赞 回复 分享
发布于 2017-07-13 13:21
// 贴上第二个代码,只通过了60% #include <iostream> #include <vector> #include <algorithm> struct X { int priority; int order; X(int p, int o) : priority(p), order(o) {} friend bool operator<(const X& lhs, const X& rhs); }; bool operator<(const X& lhs, const X& rhs) { return lhs.priority > rhs.priority; } void printOrder(const int input[], int len, int output[]) { if (len == 0) return; std::vector<X> xs; xs.reserve(len); for (int i = 0; i < len; ++i) { xs.emplace_back(input[i], i); } std::stable_sort(xs.begin(), xs.end()); for (int i = 0; i < len; ++i) { output[i] = xs[i].order; } } int main() { char in; std::vector<int> temp; while (std::cin >> in) { if (in == ',') continue; temp.push_back(in - '0'); } int *input = new int[temp.size()]; int *output = new int[temp.size()]; int len = temp.size(); for (int i = 0; i < len; ++i) *(input + i) = temp[i]; printOrder(input, len, output); for (int i = 0; i < len; ++i) { if (i == 0) std::cout << output[i]; else std::cout << ", " << output[i]; } }
点赞 回复 分享
发布于 2017-07-13 13:24
思路: 1、创建结构体,数据成员:打印编号,在数组中的初始序号,按照打印编号升序排序后的数组编号 2、保存初始顺序 3、按照打印编号升序排序 4、保存排序后顺序关系 5、恢复原来顺序关系 6、此时输出排序后顺序关系,即使正确结果 (注意,排序时相等元素必须交换,建议不要使用算法库里面的排序算法) #include<iostream> #include<vector> #include<algorithm> using namespace std; typedef struct node { int pri; //打印编号 int before; //打印序列在数组中的序号 int after; //按照打印编号升序排序后,在数组中的序号 }node; void swap(node &a,node &b) { node temp; temp = a; a = b; b = temp; } void insertsort1(vector<node> &vec,int len) //按照打印编号插入排序,一定要注意打印编号相等的处理,相等必须交换 { if (len <= 1) return; for (int i = 1; i < len; i++) { for (int j = i; j>0; j--) { if (vec[j].pri >= vec[j - 1].pri) swap(vec[j],vec[j-1]); } } } void insertsort2(vector<node> &vec, int len)//按照初始数组下标排序,恢复排序前的位置关系 { if (len <= 1) return; for (int i = 1; i < len; i++) { for (int j = i; j>0; j--) { if (vec[j].before < vec[j - 1].before) swap(vec[j], vec[j - 1]); } } } void rintOrder(const int input[], int len, int output[]) { if (len<1) return; vector<node> data(len); for (int i = 0; i<len; i++) //创建结构体 { data[i].pri = input[i]; data[i].before = i; } insertsort1(data,len); //按照打印编号升序,排序 for (int i = 0; i<len; i++) //保存某一打印编号,第几个输出 { data[i].after = i; } insertsort2(data, len); //恢复数组初始位置关系 for (int i = 0; i<len; i++) //输出数据 { output[i] = data[i].after; } } int main() { int input[] = { 9, 3, 5,3 }; int output[4]; rintOrder(input, 4, output); return 0; }
点赞 回复 分享
发布于 2017-07-13 13:54
private static void printOrder(int input[],int len,int[] output){ ArrayList<Integer> temp = new ArrayList<>(); List<Integer> src = new ArrayList<Integer>(); int result = 0; for (int i=0;i<len;i++){ src.add(input[i]); } for (int i=0;i<len;i++){ temp.add(i); } for (int i=0;i<src.size();i++){ int t =0 ; if (i<src.size()-1) t = Collections.max(src.subList(i+1,src.size())); if (src.get(i)<t){ src.add(src.get(i)); temp.add(temp.get(i)); }else{ output[temp.get(i)]=result; result++; } } } 昨天晚上华为机试的第二题,打印任务那道题的AC的代码。JAVA写感觉还挺简单的,一次性AC。
点赞 回复 分享
发布于 2017-07-13 16:30
南研所机试吗?
点赞 回复 分享
发布于 2017-07-13 16:42
你这第一题测试通过了吗?这明显没有判断括号包含的关系是否正确呀,只是测试了是否成对出现
点赞 回复 分享
发布于 2017-07-13 16:53
第三题是简单的动态规划,第二题是真的坑,我看到第二题就直接跳过了,直接做第三题,一次AC 。。然后第二题还问了客服,各种纠结!!他提到了函数原型我以为就直接实现那个函数,然后就这么写,发现不对就开始改来改去,又发现这个输入好坑啊,第一个是输入有逗号,然后这个好解决,主要是什么时候停止输入,我突然给忘了文件结束符eof了,然后一直应该就是输入出错,本机也是可以过,oj还是接触太少
点赞 回复 分享
发布于 2017-07-17 16:56

相关推荐

粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
1 21 评论
分享
牛客网
牛客企业服务