携程笔试题(含答案)
Posted 程序dunk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了携程笔试题(含答案)相关的知识,希望对你有一定的参考价值。
个人博客欢迎访问
总结不易,如果对你有帮助,请点赞关注支持一下
微信搜索程序dunk,关注公众号,获取博客源码、数据结构与算法笔记、面试笔试题
合成词展开(AC)
时间限制: 3000MS
内存限制: 589824KB
题目描述:
苏克·冯·望杜是印度著名的人工智能科学家。你正在试着阅读他的文章。但望杜写文章有个习惯,就是喜欢自己造词。他会利用现有的单词拼接上英语的一些前缀和后缀来快速造出一些新词。有些新词的组合十分复杂,读上去让人头大。作为程序员的你,很自然的想到可以写段代码把这些复杂的单词展开成词组以便理解。
已知的单词前缀和对应的含义有:
anti<word>: against <word>
post<word>: after <word>
pre<word>: before <word>
re<word>: <word> again
un<word>: not <word>
已知的单词后缀和对应的含义有:
<word>er: one who <word>s
<word>ing: to actively <word>
<word>ize: change into <word>
<word>tion: the process of <word>ing
<word>ful: full of <word>
注意:后缀与原单词的关系更加紧密,所以需要最后展开。如果同时存在多个前缀和后缀,应以原单词为中心,前缀从右到左、后缀从左到右依次展开。举个例子,unmodelize 的展开顺序如下:
unmodelize
not modelize
not change into model
虽然以上定义不是完全准确,但阅读起来不影响理解。
输入描述
输入信息为一个待展开的单词,所有字母均为小写,不含空格
输出描述
按照题意进行展开后的单词
样例输入
unmodelize
样例输出
not change into model
方法一
这道题写了整整1个小时20分钟
先处理前缀,再处理后缀:写的时候思路特别乱,一开始只通过了91%,提示TLE了然后改啊改啊,终于AC了
public class Main {
/*请完成下面这个函数,实现题目要求的功能
当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^
******************************开始写代码******************************/
static Map<String, String> preMap;
static Map<String, String> postMap;
static String worder;
static String unwangdulize(String word) {
preMap = new HashMap<>();
postMap = new HashMap<>();
preMap.put("anti", "against word");
preMap.put("post", "after word");
preMap.put("pre", "before word");
preMap.put("un", "not word");
preMap.put("re", "word again");
postMap.put("re", "one who words");
postMap.put("gni", "to actively word");
postMap.put("ezi", "change into word");
postMap.put("noit", "the process of wording");
postMap.put("luf", "full of word");
worder = word;
String preWord = prefix(worder);
String nowWord = worder;
String postWord = postfix(worder);
//System.out.println(preWord);
//System.out.println(postWord);
StringBuilder builder = new StringBuilder(preWord);
int indexOf = builder.indexOf(worder);
builder.replace(indexOf, indexOf + nowWord.length(), postWord);
return builder.toString();
}
private static String postfix(String word) {
ArrayList<String> postList = new ArrayList<>();
String post = "";
boolean flag = false;
for(int i = word.length() - 1; i >= 0; i--) {
if (postMap.containsKey(post)) {
postList.add(post);
post = "";
}
if (post.length() > 5) {
StringBuilder builder = new StringBuilder(post);
post = builder.reverse().toString();
post = word.substring(0, i + 1) + post;
flag = true;
break;
}
post = post + word.charAt(i);
}
if (!flag) {
worder = new StringBuilder(post).reverse().toString();
} else {
worder = post;
}
String curWord = worder;
for(int i = postList.size() - 1; i >= 0; i--) {
String newWord = postMap.get(postList.get(i));
int index = newWord.indexOf("word");
StringBuilder builder1 = new StringBuilder(newWord);
builder1.replace(index, index + 4, curWord);
curWord = builder1.toString();
}
return curWord;
}
private static String prefix(String word) {
ArrayList<String> preList = new ArrayList<>();
String pre = "";
for (int i = 0; i < word.length(); i++) {
if (preMap.containsKey(pre)) {
preList.add(pre);
pre = "";
}
if (pre.length() > 5) {
pre += word.substring(i);
break;
}
pre = pre + word.charAt(i);
}
worder = pre;
String curWord = worder;
for(int i = preList.size() - 1; i >= 0; i--) {
String newWord = preMap.get(preList.get(i));
int index = newWord.indexOf("word");
StringBuilder builder1 = new StringBuilder(newWord);
builder1.replace(index, index + 4, curWord);
curWord = builder1.toString();
}
return curWord;
}
/******************************结束写代码******************************/
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String res;
String _word;
try {
_word = in.nextLine();
} catch (Exception e) {
_word = null;
}
res = unwangdulize(_word);
System.out.println(res);
}
}
//modelmodelmodelizefulinger
数组碰撞(AC)
时间限制: 3000MS
内存限制: 589824KB
题目描述:
长度为N的数组中有N个正整数,每次从中取出任意两个整数x和y,然后比较这两个整数:如果 x 与 y 相等,那么销毁这两个元素,否则,销毁这两个元素并加入这两个元素的差。最后最多只会剩下一个数字,返回这个数字最小的情况是多少,如果数组为空则返回0
输入描述
以字符串的形式输入一串数字, 数字间用逗号分隔
输出描述
返回这个数字最小的情况是多少。
比如入参数组为:1,2,1,7,9,4
最小的结果为0:
第一轮选出2和4,差为2, 数组变成 1, 1, 7, 9, 2 第二轮选出7和9,差为2, 数组变成 1, 1, 2, 2 第三轮选出2和2,差为0, 数组变成 1, 1
第四轮选出1和1,差为0, 数组为空,返回 0
样例输入
1,2,1,7,9,4
样例输出
0
提示
编码就是普通的背包问题,需要思考下如何把题干转换为背包问题~
方法一
力扣原题:1049. 最后一块石头的重量 II
public class Main {
/*请完成下面这个函数,实现题目要求的功能
当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^
******************************开始写代码******************************/
static int collide(int[] numbers) {
return lastStoneWeightII(numbers);
}
static int lastStoneWeightII(int[] stones) {
int sum = 0;
for (int weight : stones) {
sum += weight;
}
int n = stones.length, m = sum / 2;
boolean[][] dp = new boolean[n + 1][m + 1];
dp[0][0] = true;
for (int i = 0; i < n; ++i) {
for (int j = 0; j <= m; ++j) {
if (j < stones[i]) {
dp[i + 1][j] = dp[i][j];
} else {
dp[i + 1][j] = dp[i][j] || dp[i][j - stones[i]];
}
}
}
for (int j = m;; --j) {
if (dp[n][j]) {
return sum - 2 * j;
}
}
}
/******************************结束写代码******************************/
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String str = in.nextLine();
String[] stringArray = str.split("\\\\,");
int[] numbers = new int[stringArray.length];
for(int i=0;i<stringArray.length;i++){
numbers[i] = Integer.parseInt(stringArray[i]);
}
int res = collide(numbers);
System.out.println(String.valueOf(res));
}
}
以上是关于携程笔试题(含答案)的主要内容,如果未能解决你的问题,请参考以下文章