本人化学小硕一枚,因为本行业对我这种缺钱的人来说太不友善,无奈要走上码农之路。虽然本科阶段辅修过武汉七校的CS双学位,但是理论和技术一直都很渣,python和java还是稀烂。马上就要找工作了,现在连个互联网实习都找不到,心里实在很心酸。想着化学学得也不差,但是研究生阶段的实验好像并不怎么用脑子,头都快生锈了。我不想人生就这样混过去,想来点刺激点的,秃就秃吧。抱着试一试的心态,撸起袖子赶紧干,时间已经不多了。一边看视频,一边刷网上的面试试题。今天做了一下华为的实习笔试试题,难度也不算很大,虽然花的时间有点长,慢慢来总是可以的。
话不多说,先看第一题。
校招题1 字符串重排
给定一个原始字符串,统计字符串中各字符出现的次数,并按照ASCII码递增的顺序依次输出。
例:原始字符串为eeefgghh
统计字符串中各字符的出现次数:
e : 3
f : 1
g : 2
h : 2
重排字符串输出为:efgheghe
说明:给定的原字符串只包含数字和字母,大写字母和小写字母存在区别。
样例输入输出:
eeefgghh
efgheghe
public static void main(String [] args) {
String demo="abbdcdacbcadeef";
System.out.println(getStringSorted(demo));
}
public static String getStringSorted(String str) {
char c[]=str.toCharArray();
int [] indexArray=new int [123];
int maxLength=0;
for(char x:c) {
maxLength=(maxLength>indexArray[x]++?maxLength:indexArray[x]);
}
String []s=new String[maxLength];
for(int j=0;j<s.length;j++) {
for(int k=0;k<indexArray.length;k++) {
if(indexArray[k]>0) {
if (s[j]==null) {
s[j]=String.valueOf((char)k);
}
else {
s[j]=s[j]+(char)k;
}
indexArray[k]--;
}
}
}
String string="";
for(String k:s) {
string+=k;
}
return string;
}
}
第二题是一道关于dp的问题,但是我这里没有用到这个思想,因为比较难实现。
题目描述
给出一组正整数,你从第一个数向最后一个数方向跳跃,每次至少跳跃1格,每个数的值表示你从这个位置可以跳跃的最大长度。计算如何以最少的跳跃次数跳到最后一个数。
输入描述:
第一行表示有多少个数n
第二行开始依次是1到n个数,一个数一行
输出描述:
输出一行,表示最少跳跃的次数。
示例1
输入
7
2
3
2
1
2
1
5
输出
3
说明
7表示接下来要输入7个正整数,从2开始。数字本身代表可以跳跃的最大步长,此时有2种跳法,为2-2-2-5和2-3-2-5都为3步,这里没有具体要求方案,只需求出最后的步数,那我们就直接从终点往前分析,比较容易的可以看出每次取离终点最远的那个点作为出发点。比如2,3,2,1,2,1,5.能直接一步到达终点且离终点最远的是倒数第三个点,值为2,可以证明这样做是对的。代码直接贴上:import java.util.Scanner;
public class Hero{
public static void main(String args []){
Scanner sc=new Scanner(System.in);
int x=sc.nextInt();
int [] array=new int [x];
for (int i = 0; i < array.length; i++) {
array[i]=sc.nextInt();
}
sc.close();
int min=0;
int n=x-1;
System.out.println(n);
while(n>0) {
for (int i = 0; i<n; i++) {
if(array[i]>=n-i) {
n=i;
min+=1;
}
}
}
System.out.println(min);
}
}