腾讯暑期实习编程题
1、构造回文
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子1:
abcda
google
输出例子1:
2
2
思路:因为回文是从前往后读和从后往前读的结果一样,所以这个题可以转换成最长公共子序列问题(LCS问题),即求出字符串和字符串的反串之间的最长公共子序列。
最长公共子序列问题(LCS问题):
https://www.cnblogs.com/wangkundentisy/p/9346376.html
代码:
import java.nio.charset.spi.CharsetProvider;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static int max=0;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNext()){
String string = input.nextLine();
char[] array = string.toCharArray();
char[] temparray = new char[array.length];
int[][] result = new int[array.length+1][array.length+1];
for(int i=0;i
二、大写字母挪到小写字母后
小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
第一种思路:用冒泡的方法,从后向前遍历字符串,把大写字母用冒泡的方法放在字符串后面。
第二种思路:将字符串去掉大写字母+字符串去掉小写字母,即 str.replaceAll("[A-Z]","")+str.replaceAll("[a-z]","");
待补
import java.util.*;
public classMain{
public static void main(String[] args){
Scanner scan = newScanner(System.in);
while(scan.hasNext()){
String str = scan.nextLine();
System.out.println(getResult(str));
}
}
public static String getResult(String str){
return str.replaceAll("[A-Z]","")+str.replaceAll("[a-z]","");
}
}
华为研发工程师编程题
一、汽水瓶
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
输入描述:
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
思路:每次喝完水之后都要进行新一轮的换瓶子,很像是递归,所以用递归来做。每次输入空瓶数,计算出能换几瓶水。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNext()) {
int n = input.nextInt();
if(n==0)
break;
else {
System.out.println(Ping(n));
}
}
}
public static int Ping(int numPing){
if(numPing==2)
return 1;
else if(numPing<2)
return 0;
else {
return numPing/3+Ping(numPing/3+numPing%3);
}
}
}
二、明明的随机数
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。
Input Param
n 输入随机数的个数
inputArray n个随机整数组成的数组
Return Value
OutputArray 输出处理后的随机整数
输入描述:
输入多行,先输入随机整数的个数,再输入相应个数的整数
输出描述:
返回多行,处理后的结果
思路:华为的题一般不难,不用想着怎么降低时间和空间复杂度,只需要用最简单的方法做出来就可以了,以此省出时间争取多做一道题。
这道题用的思路是先将数字排序,再把排好序中的数字从小到大去除重复数字后加入到arraylist中。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNext()) {
int n = input.nextInt();
int[] array = new int[n];
for(int i=0;i arrayList = new ArrayList();
for(int i=0;i
三、进制转换
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。(多组同时输入 )
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
思路:还是一样的,只需要用最简单的方法做出来就行了。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNext()) {
String string = input.nextLine();
char[] array = string.toCharArray();
int weight=1;//每一位数字的权重,比如A1中,A就要乘16,那么他的权重就是16
int result=0;
for(int i=array.length-1;i>1;i--) {//16进制前面有ox
int num=0;
switch (array[i]) {
case 'A': num=10;break;
case 'B': num=11;break;
case 'C': num=12;break;
case 'D': num=13;break;
case 'E': num=14;break;
case 'F': num=15;break;
default: num =(int)array[i]-(int)('0');
}
result += num*weight;
weight *= 16;
}
System.out.println(result);
}
}
}