今日头条2017后端工程师笔试题

1、最大映射

有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?

输入描述:

每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不超过 12 且仅包含大写字母 A-J 的字符串。 n 不大于 50,且至少存在一个字符不是任何字符串的首字母。

输出描述:

输出一个数,表示最大和是多少。

输入例子:

2

ABC

BCA

输出例子:

1875

代码如下:

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<numeric>    //数值算法
using namespace std;

//节点类:每个字符对应一个权重
struct Node
{
	char ch;
	long long num;
	Node() {}       //默认构造函数
	Node(char c, int n) :ch(c), num(n)
	{
	}
};

//按照权重对节点进行排序
bool cmp(const Node &a, const Node &b)
{
	return a.num < b.num;
}

//取得每个字符的权重
void getWeight(vector<string> &data, vector<Node> &arr)
{
	for (int i = 0; i < data.size(); ++i)
	{
		long long index = 1;
		for (int j = data[i].size() - 1; j >= 0; --j)
		{
			int pos = data[i][j];
			arr[pos - ‘A‘].num += index;
			index *= 10;
		}
	}
}

int main()
{
	int n;
	while (cin >> n)
	{
		string str;
		//字符串集合
		vector<string> data(n);
		for (int i = 0; i < n; ++i)
		{
			cin >> str;
			data[i] = str;
		}
		//节点类集合
		vector<Node> arr(10);
		for (int i = ‘A‘; i <= ‘J‘; ++i)
		{
			arr[i - ‘A‘] = Node(i, 0);
		}
		//计算每个字符的权重
		getWeight(data, arr);
		//按照权重由小到大进行排序
		sort(arr.begin(), arr.end(), cmp);
		//每个字符是否在字符串首位置出现过(1:出现过)
		vector<int> flag(10, 0);
		for (int i = 0; i < n; ++i)
		{
			flag[data[i][0] - ‘A‘] = 1;
		}
		//在排序数组中,第一个没有在字符串首位置出现的字符的位置
		int spec_pos = 0;
		for (; spec_pos < 10; ++spec_pos)
		{
			if (flag[arr[spec_pos].ch - ‘A‘] == 0)
				break;
		}
		Node tmp = arr[spec_pos];
		//向后移动一位,把spec_pos位置的元素放在首部
		for (int i = spec_pos; i > 0; --i)
		{
			arr[i] = arr[i - 1];
		}
		arr[0] = tmp;
		//将0~9赋值给相应的字符
		vector<int> numArr(10);
		for (int i = 0; i < 10; ++i)
		{
			numArr[arr[i].ch - ‘A‘] = i;
		}
		//字符串集合转换为整型数集合
		vector<long long> num(n);
		for (int i = 0; i < n; ++i)
		{
			long long val = 0;
			long long index = 1;
			for (int j = data[i].size() - 1; j >= 0; --j)
			{
				val += numArr[data[i][j] - ‘A‘] * index;
				index *= 10;
			}
			num[i] = val;
		}
		long long count = 0;
		//对整型数集合求值
		cout << accumulate(num.begin(), num.end(), count) << endl;
	}

	return 0;
}

  

时间: 2024-10-10 14:16:56

今日头条2017后端工程师笔试题的相关文章

今日头条2017后端工程师实习生笔试题 - 题解

今日头条2017后端工程师实习生笔试题 最大映射 题意 给n(不超过50)个字符串,每个字符串(长度不超过12)由A-J的大写字符组成.要求将每个字符映射为0-9,使得每个字符串可以看作一个整数(不能有前导零),求这些字符串映射后得到数字的最大和值.(数据保证至少有一个字符不是任何字符串的首字母) 思路 根据字符所在的位置,累积统计每个字符的权值,从右到左权值分别为1, 10, 100, 1000..... 然后排序,从权值最小的到权值最大的依次映射为0-9,求和即为答案. 注意 由于每个字符串

今日头条2017后端工程师实习生笔试题

第二题: [编程题] 木棒拼图 有一个由很多木棒构成的集合,每个木棒有对应的长度,请问能否用集合中的这些木棒以某个顺序首尾相连构成一个面积大于 0 的简单多边形且所有木棒都要用上,简单多边形即不会自交的多边形. 初始集合是空的,有两种操作,要么给集合添加一个长度为 L 的木棒,要么删去集合中已经有的某个木棒.每次操作结束后你都需要告知是否能用集合中的这些木棒构成一个简单多边形. 输入描述: 每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n 表示操作的数量(1 ≤ n ≤ 50000)

算法面试题-今日头条2017客户端工程师实习生笔试题4:或与加

今日头条2017客户端工程师实习生笔试题 题目: 这个题做到最后,时间不是很够,题目内容比较简单,求出第k个正整数符合x+y=x|y,然而这个k的取值范围非常大(k<=2000000000),所以可以不用考虑穷举法,当然,时间不够的话写个穷举试试运气也可以. 穷举法: 1 import java.util.Scanner; 2 3 /** 4 * Created by Administrator on 2016/9/6. 5 */ 6 7 public class Main { 8 public

腾讯web前端开发工程师笔试题及答案

1. 如何实现事件委托? 首先要知道什么是事件委托. 考虑一个列表,在li的数量非常少的时候,为每一个li添加事件侦听当然不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(当然只是一个解释,实际工作中很少遇到这么多li的情况),为每个li添加事件侦听就会对页面性能产生很大的影响. 就像下面这段代码: <!DOCTYPE HTML><html><head><meta charset="utf-8" /><ti

Java工程师笔试题整理[校招篇]

隔着两个月即将开始校招了.你是不是也想借着这个机会崭露头角,拿到某些大厂的offer,赢取白富美.走上人生巅峰?当然如果你还没能打下Java基础,一定要先打好Java基础:如何一步一步的学Java - 学习编程 - 知乎专栏.然后再来看一下练习一下各大厂的面试笔试题目. 如果以下内容满足不了你,你还可以去看这篇: 2016校招编程题汇总 - 学习编程 - 知乎专栏 进入主要内容(主要内容整理来自牛客网:牛客网)(以下内容按照各大公司进行划分,对每一公司按照年份进行划分,如果想想下载以下内容,可以

搜狗2015C++工程师笔试题解题分析

试卷链接:搜狗2015 C++工程师笔试题. 1.假设整数0x12345678 存放在内存地址0x0开始的连续四个字节中 (即地址0x0到 0x3). 那么在以Little Endian字节序存储的memory中,地址0x3的地方存放的字节是: 0x12 0x34 0x56 0x78 分析:选D.小端法和大端法. a) Little-Endian就是低位字节排放在内存的低地址端, 高位字节排放在内存的高地址端. b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地

2014-07-29 Asp.Net 工程师 笔试题

一.选择题    1.下列描述错误的是() A  类不可以被多重继承而接口可以: B  抽象类自身可以定义成员而接口不可以: C  抽象类和接口都不能被实例化: D   一个类可以继承多个基类和多个基接口: 2.下列哪个名词和WebServices不直接相关() A  UDDI B  GUID C  WSDL D  SOAP 3.下列选项中,()是引用类型 A  enum B struct C  string D  Int 4.声明一个委托 public delegate int myCallB

iOS开发工程师笔试题

iOS开发工程师笔试题 分类: IOS 面试题2013-01-17 10:28 820人阅读 评论(0) 收藏 举报 随着iOS平台开发的职位的增加,笔试.面试也越来越有“套路”,这里我总结了一些面试题,多数是Objective-C的基础知识,适合于面试新人,答案是我自己答的,不准确的地方,欢迎指出. 1.   Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? Object-c的类不可以多重继承:可以实现多个接口,通过实

高级软件测试工程师笔试题

1.某目录下所有文件统一批量修改ip 2.获取登陆者自身ip 3.删除某目录下小于10b的文件 4.通过Linux执行MySQL脚本 5.监控某Java进程下所有线程数 6.QTP.watir与selenium的优劣对比 7.什么是回归测试,侧重点是什么 8.什么是场景下考虑性能测试 9.简述安全测试流程 10.a.建class表包括name,id b.插name=wonter,id=1到class表 c.查询id<2的所有名称 d.将以上操作通过存储过程形式写出 e.执行该存储过程 答案一周后