您的位置:首页 > 编程语言

笔试实践1---2017年网易在线笔试之编程题

2016-08-03 13:10 363 查看
8.2是其公司的在线笔试题,自己也是第二次参加了,重在参与吧。也暴露出自己算法方面和思维方面的短板吧,准备不足,没做过这方面的锻炼。生命不息,学习不止,编程不止,任重而道远。

废话不多说,其第1题比较简单。题目大意是这样的:

题1.学习了字符串后,小明非常高兴。他在纸上写了一个字符串,然后随意删除字符。这个时候呢,出问题了。假如给定任意一个字符串,从中删掉恰好两个字符,能有多少种不同的字符串呢?

比如字符串“data”删掉2个字符,可以得到“da”,"dt","at","aa","ta"这5个不同的字符串。

输入条件是这样的:

输入一组测试数据,每个数据只有一行,包含一个仅有小写字母组成的字符串,其中字符串长度不小于2且不超过100000。

输出的话,给出总共结果个数。

题2.小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和的数字中的最小数。

输入描述:

输入第一行为数字个数n (n ≤ 20)
第二行为n个数xi (1 ≤ xi ≤ 100000)

输出描述:

输出最小不能由n个数选取求和组成的数

输入例子:

3
5 1 2

输出例子

4

本题答案在最后,建议先自己写写,最后再参考下,说不定你的方法更好。

第1题答案就不写了,很简单的,相信你们也都不屑。那借此写下另一个方法的总结。

如何删除ArrayList中的重复项。

1)如果不考虑返回list的元素的顺序的话,可以利用Set来实现。

      因为Set集合里面的元素是无序的,而且不允许有重复的元素,所以利用这个性质,可以满足需求

public static void removeDuplicate(ArrayList arrList) {
HashSet mHashSet = new HashSet(arrList);
arrList.clear();
arrList.addAll(mHashSet);
}


2)假如要考虑list返回的元素的顺序的话。

public   static   void  removeDuplicateWithOrder(List list)   {
Set set  =   new  HashSet();
List newList  =   new  ArrayList();
for  (Iterator iter  =  list.iterator(); iter.hasNext();)   {
Object element  =  iter.next();
if  (set.add(element))
newList.add(element);
}
list.clear();
list.addAll(newList);
System.out.println( " remove duplicate "   +  list);
}
3)当然,我们最蠢的方法是利用list.contains()方法来判断;

public static ArrayList method(ArrayList array) {
ArrayList arr = new ArrayList();
Iterator it = array.iterator();
while(it.hasNext()){
Object obj = it.next();
if(!arr.contains(obj))
arr.add(obj);
}
return arr;
}


第一题中相信你也会用到上面的方法

附第二题答案:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner mScanner=new Scanner(System.in);
int len=mScanner.nextInt();
List<Integer> list=new ArrayList<Integer>();
for (int i = 0; i < len; i++) {
list.add(mScanner.nextInt());
}
Collections.sort(list);

int sum=0;
for (int i = 0; i < len; i++) {
if (list.get(i)>sum+1) {
break;
}else {
sum+=list.get(i);
}
}
System.out.println(sum+1);
}
}

实现的想法是这样的:

如果A0...An可以得到[1, A0+A1+...+An]间所有的数,此时再引入A(n+1),可以得到的新的一段区间是[A(n+1),A(n+1)+1,...,A(n+1)+A0+A1+...+An]。这个区间和原来的区间之间不能有gap,否则就会有求不到的和。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: