2015华为校园招聘机试题<一>

时间:2022-05-12 15:24:51

2015华为校园招聘机试题<一>

今天无意之间看到了2015年华为校园招聘的机试题,于是,做了下,写出来与大家共享。先看第一题;
题目如下:

  • 按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。
    例如:输入2,8,“abc”,“123456789”,则输出为“abc00000”,“12345678“,”90000000”

思路很简单,实现也很简单,代码如下:


package org.wrh.huaweiproject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;

/*
* 按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。
* 例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”
* */

public class TopicOne {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
/*
* m代表要输入的字符串个数
* */

System.out.println("请输入要输入字符串的个数:");
int m=sc.nextInt();

/*
* n代表输出的每个字符串的长度
* */

System.out.println("请输入将上面输入的每个字符串输出的个数为:");
int n=sc.nextInt();
/*
* 读取从控制台输入的字符串
* */

System.out.println("请输入"+m+"个字符串,用空格分开");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=null;
try {
str = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*
* 将从控制台读入的数据根据空格分开
* */

String[] strArray=str.split("\\s+");
System.out.println(Arrays.toString(strArray));
splitStringPrint(strArray,n);

}
/*
* 完成将字符串按照要求输出
* */

private static void splitStringPrint(String[] string,int len) {
// TODO Auto-generated method stub

for(String str:string){
while(str.length()>len){
System.out.println(str.substring(0, len));
str=str.substring(len, str.length());
}
//对于长度小于len的将补零
int stringLength=str.length();
if(stringLength>0&&stringLength<=len){
for(int i=0;i<len-stringLength;i++){
str+="0";
}
System.out.println(str);

}
}

}

}

上面的代码的注释写的比较详细,也比较简单,相信比较好理解

注意:我们平时写代码大多是按照上面来写,有提示输入等等这样的好习惯,但是当我们在机试中的时候,是不允许这样的,因为在机试的过程中,机器是只要我们的结果的,只有你的结果满足他设置的形式,才能正确提交的。因此这是我们需要注意的,特别是从来没有参加过机试的人应特别引起注意。

下面的代码就是没有提示输入和一些调试bug的输出等提示的代码,如下:

package org.wrh.huaweiproject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;

/*
* 按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。
* 例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”
* */

public class TopicOneDemo {

public static void main(String[] args) {
/*
* m代表要输入的字符串个数
* */

int m;

/*
* n代表输出的每个字符串的长度
* */

int n;
/*
* 读取从控制台输入的字符串
* */

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=null;
try {
str = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*
* 将从控制台读入的数据根据逗号分开
* */

String[] strArrayTemp=str.split(",");
//数组中的第一个元素就是我们的m值
m=Integer.valueOf(strArrayTemp[0]);
//数组中的第二个元素就是我们的n值
n=Integer.valueOf(strArrayTemp[1]);
/*
* 将我们输入的字符串数据提取出来,换到另外一个数组中
* */

String strArray[]=new String[m];
for(int i=0;i<m;i++){
strArray[i]=strArrayTemp[2+i];
}
splitStringPrint(strArray,n);

}
/*
* 完成将字符串按照要求输出
* */

private static void splitStringPrint(String[] string,int len) {
// TODO Auto-generated method stub

for(String str:string){
while(str.length()>len){
System.out.print(str.substring(0, len)+" ");
str=str.substring(len, str.length());
}
//对于长度小于len的将补零
int stringLength=str.length();
if(stringLength>0&&stringLength<=len){
for(int i=0;i<len-stringLength;i++){
str+="0";
}
System.out.print(str+" ");

}
}

}

}

如有不正确的或者是有更好的方法来实现,欢迎大家批评指正。其余的几题会陆续和大家分享

修正:感谢Silencer9527这位朋友在评论区提出的好问题,问题的答案已在评论区给出,该朋友的问题如下:

-如果m=4;n=4
字符串输入 abc 是应该输出abc?还是应该输出 abc0 ,0000,0000,0000这样的结果呢?

程序中确实没有考虑这种情况,为了能让更多的人看到原程序的问题,因此之前博客中写的内容我就不改动,我就在下面重新贴上修正后的代码,程序修正后的代码如下:

package org.wrh.huaweiproject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;

/*
* 按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。
* 例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”
* */

public class TopicOneDemo01 {

public static void main(String[] args) {
/*
* m代表要输入的字符串个数
* */

int m;

/*
* n代表输出的每个字符串的长度
* */

int n;
String[] strArrayTemp=input();

//数组中的第一个元素就是我们的m值
m=Integer.valueOf(strArrayTemp[0]);
//数组中的第二个元素就是我们的n值
n=Integer.valueOf(strArrayTemp[1]);
/*
* 将我们输入的字符串数据提取出来,换到另外一个数组中
* 这里要注意的是要把这样的情况考虑进去,当我们输入:4,4,abc这样的情况(即我们实际输入的字符串的个数比我们想要输入的字符串的个数要少)
* */

String strArray[]=new String[m];
/*
* 将输入的字符串换到另外一个数组中
* */

for(int i=0;i<strArrayTemp.length-2;i++){
strArray[i]=strArrayTemp[2+i];
}
if((strArrayTemp.length-2)<m){//若我们实际输入的字符串的个数比我们想要输入的字符串的个数要少,则用""空字符串来填
for(int i=strArrayTemp.length-2;i<m;i++){
strArray[i]="";
}

}
splitStringPrint(strArray,n,m);

}
/*
* 函数功能:读取从控制台输入的字符串
* */

private static String[] input() {

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=null;
try {
str = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

/*
* while循环保证输入是符合要求的,即保证m和n值是数字且实际输入的字符串的个数要小于等于要求输入的个数(即不允许出现输入:2,3,abc,asdf,asdfgh这种情况发生)
* */

while(true){
/*
* 将从控制台读入的数据根据逗号分开
* */

String[] strArrayTemp=str.split(",");
if(strArrayTemp[0].matches("\\d+")&&strArrayTemp[1].matches("\\d+")&&(strArrayTemp.length<=Integer.valueOf(strArrayTemp[0]))){
return strArrayTemp;
}
else{
try {
System.out.println("请重新输入:");
str=br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/*
* 完成将字符串按照要求输出
* */

private static void splitStringPrint(String[] string,int len,int m) {
// TODO Auto-generated method stub

for(int i=0;i<m;i++){
while(string[i].length()>len){
System.out.print(string[i].substring(0, len)+" ");
string[i]=string[i].substring(len, string[i].length());
}
//对于长度小于len的将补零
int stringLength=string[i].length();
if(stringLength>=0&&stringLength<=len){
for(int j=0;j<len-stringLength;j++){
string[i]+="0";
}
System.out.print(string[i]+" ");

}
}

}

}

说明:以上的程序中的某个功能可以用数组的某些函数来填充,例如下面的这个用空字符串来填充完全可以用Arrays.fill(一些参数)来替换,但是当我们在机试的过程中可能不能够想到这个函数,因此程序中也就没有这样做。

if((strArrayTemp.length-2)<m){//若我们实际输入的字符串的个数比我们想要输入的字符串的个数要少,则用""空字符串来填
for(int i=strArrayTemp.length-2;i<m;i++){
strArray[i]="";
}

最后,在此对提出问题的朋友表示感谢,若程序还可以进行优化或者是还有没有考虑到的问题,欢迎批评指正。在下不胜感谢