騰訊暑期實習編程題
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<array.length;i++)
temparray[i] = array[array.length-1-i];
for(int i=0;i<array.length;i++){
result[0][i]=0;
result[i][0]=0;
}
for(int i=1;i<=array.length;i++){
for(int j=1;j<=array.length;j++){
if(array[i-1]==temparray[j-1]){
result[i][j]=result[i-1][j-1]+1;
}else{
result[i][j]=Math.max(result[i-1][j], result[i][j-1]);
}
}
}
System.out.println(array.length-result[array.length][array.length]);
}
}
}
二、大寫字母挪到小寫字母后
小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<n;i++) {
array[i]= input.nextInt();
}
Arrays.sort(array);
ArrayList<Integer> arrayList = new ArrayList<Integer>();
for(int i=0;i<n;i++) {
arrayList.add(array[i]);
while(i<n-1 &&array[i]==array[i+1])
i++;
}
for(int i=0;i<arrayList.size();i++) {
System.out.println(arrayList.get(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);
}
}
}