刚刚做完了华为的实习生笔试,三个题,楼主渣渣,只有第一个能满分
首先回顾一下题目:
1 输入n个字符串,要求将每个字符串8个分一组,不够的补0,比如123456789应该分成12345678,90000000,然后升序排列,相同的字符串不能删除
输入 2 123 qwertasdfg
输出 12300000 qwertasd fg000000
2输入一个包含数字,括号(大中小都有),字母的字符串,数字代表后面括号内的字符串的输出次数,并且数字后面一定有括号,,变形后倒序输出
如输入 abc3(A) 则输出AAAcba
2[3(qw)] 输出 wqwqwqwqwqwq
3 输入一个矩阵,每个点的值代表山的高度,让你从一个点爬到另外一个点,要求不能走走过的点,而且接下来的点一定比你当前的点海拔高
如
4 5 代表矩阵的维度
0 1 2 0 2 0
1 2 8 9 7 0
0 1 2 0 2 0
1 2 8 9 7 0
1 2 3 8 1,2是起点 3,8 是重点
输出
5(我忘了点了,这个输出随便写的)
下面说的博主的做法都是基于java
1 这一题相对很简单,java里string转成char数组,用arraylist存储,最后使用collections排序就可以了,直接上代码
Scanner scanner =new Scanner(System.in);
int a=scanner.nextInt();
List<String> strings =new ArrayList<String>();
for (int i = 0; i < a; i++) {
String string =scanner.next();
char chars[]=string.toCharArray();
int l =chars.length;
for(int ii=0 ;ii<l/8;ii++) {
strings.add(new String(chars, ii*8, 8));
}
if(l%8>0) {
StringBuffer add =new StringBuffer(string.substring(l-l%8));
for(int ii =0 ;ii<8-l%8;ii++) {
add.append("0");
}
strings.add(add.toString());
}
}
//这里使用collections排序,string的比较大小直接使用compare比较就可以
Collections.sort(strings,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);
}
});
//输出
for (int i=0;i<strings.size();i++) {
System.out.print(strings.get(i)+" ");
}
然后第二题,我们可以根据处理的先后顺序判断,首先处理小于号,然后处理[],最后处理{}
这里我是频繁的使用了string转chararray,利用stringbuffer拼接,不知道为什么,准确率只有百分之60(可能数字有可能是两位?)
而且我感觉自己这样写实在太麻烦了,所以考虑用栈或者队列之列的改写,留坑。
Scanner scanner =new Scanner(System.out);
char[]cs =scanner.nextLine().toCharArray();
List<String> strings =new ArrayList<>();
int q=0;
for(int i=0 ;i<cs.length;i++) {
if(cs[i]=='(') {
StringBuffer stringBuffer =new StringBuffer();
for(int ii=i+1;ii<cs.length;ii++) {
if(cs[ii]==')') {
q=ii;
cs[ii]='!';
break;
}else {
stringBuffer.append(cs[ii]);
}
cs[ii]='!';
}
String string =stringBuffer.toString();
for(int ii=1;ii<cs[i-1]-'0';ii++) {
stringBuffer.append(string);
}
if(cs[i-1]-'0'==0) {
stringBuffer=new StringBuffer();
stringBuffer.append("");
}
cs[i-1]='!';
strings.add(stringBuffer.toString());
i=q+1;
}
}
StringBuffer stringBuffer1 =new StringBuffer();
q=0;
for(int i =0;i<cs.length;i++) {
if(cs[i]=='(') {
stringBuffer1.append(strings.get(q));
q++;
}else if(cs[i]=='!'){
}else {
stringBuffer1.append(cs[i]);
}
}
cs =stringBuffer1.toString().toCharArray();
strings .clear();
q=0;
for(int i=0 ;i<cs.length;i++) {
if(cs[i]=='[') {
StringBuffer stringBuffer =new StringBuffer();
for(int ii=i+1;ii<cs.length;ii++) {
if(cs[ii]==']') {
q=ii;
cs[ii]='!';
break;
}else {
stringBuffer.append(cs[ii]);
}
cs[ii]='!';
}
String string =stringBuffer.toString();
for(int ii=1;ii<cs[i-1]-'0';ii++) {
stringBuffer.append(string);
}
if(cs[i-1]-'0'==0) {
stringBuffer=new StringBuffer();
stringBuffer.append("");
}
cs[i-1]='!';
strings.add(stringBuffer.toString());
i=q+1;
}
}
stringBuffer1 =new StringBuffer();
q=0;
for(int i =0;i<cs.length;i++) {
if(cs[i]=='[') {
stringBuffer1.append(strings.get(q));
q++;
}else if(cs[i]=='!'){
}else {
stringBuffer1.append(cs[i]);
}
}
cs =stringBuffer1.toString().toCharArray();
strings .clear();
q=0;
for(int i=0 ;i<cs.length;i++) {
if(cs[i]=='{') {
StringBuffer stringBuffer =new StringBuffer();
for(int ii=i+1;ii<cs.length;ii++) {
if(cs[ii]=='}') {
q=ii;
cs[ii]='!';
break;
}else {
stringBuffer.append(cs[ii]);
}
cs[ii]='!';
}
String string =stringBuffer.toString();
for(int ii=1;ii<cs[i-1]-'0';ii++) {
stringBuffer.append(string);
}
if(cs[i-1]-'0'==0) {
stringBuffer=new StringBuffer();
stringBuffer.append("");
}
cs[i-1]='!';
strings.add(stringBuffer.toString());
i=q+1;
}
}
stringBuffer1 =new StringBuffer();
q=0;
for(int i =0;i<cs.length;i++) {
if(cs[i]=='{') {
stringBuffer1.append(strings.get(q));
q++;
}else if(cs[i]=='!'){
}else {
stringBuffer1.append(cs[i]);
}
}
cs=stringBuffer1.toString().toCharArray();
stringBuffer1=new StringBuffer();
for(int i=cs.length-1 ;i>=0;i--) {
stringBuffer1.append(cs[i]);
}
System.out.println(stringBuffer1.toString());
第三题,递归最好,直接看代码
然而准确率只有36,原因是时间超过10秒了,所以只能嘤嘤嘤了,继续留坑
(我发现你直接输出3就有18的正确率,继续嘤嘤嘤)
public static long name(int x, int y, int[][] q, int a, int b, int c, int d) {
long i = 0;
if(a==c&&b==d)
return 1;
if (a + 1 < x &&q[a][b]<q[a+1][b]) {
i += name(x, y, q, a + 1, b, c, d);
}
if (a - 1>0 &&q[a][b]<q[a-1][b]) {
i += name(x, y, q, a - 1, b, c, d);
}
if (b + 1 < y &&q[a][b]<q[a][b+1]) {
i += name(x, y, q, a , b+1, c, d);
}
if (b - 1 >0&&q[a][b]<q[a][b-1]) {
i += name(x, y, q, a , b-1, c, d);
}
return i;
}
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int x=scanner.nextInt();
int y =scanner.nextInt();
int q [][] =new int [x][y];
for(int i= 0 ;i<x;i++) {
for(int ii=0 ;ii<y;ii++) {
q[i][ii]=scanner.nextInt();
}
}
int a =scanner.nextInt();
int b =scanner.nextInt();
int c =scanner.nextInt();
int d =scanner.nextInt();
System.out.println(name(x, y, q, a, b, c, d)/1000000000);
}