华为之前的机试题java实现
因为最近在找工作2016年8月26号可能就要参加华为的机试据说只有三道题做对一道就ok。
现在在做华为之前的机试题。会把题目和我自己的做法贴出来,希望大家批评改正!
第一题
输入一个字符串,将其各个字符对应的ASCII值加5后,输出结果。
该字符串只包含小写字母,若其值加5后的字符值大于’z’,将其转换成从a开始的字符。
package com.FORJOBS.SigaTest.HUAWEI;
import java.util.Scanner;
/*
* 程序实现目标: 输入一个字符串,将其各个字符对应的ASCII值加5后,输出结果。
* 程序要求:该字符串只包含小写字母,若其值加5后的字符值大于'z',将其转换成从a开始的字符。
*/
public class Pogram_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
String str = s.next();
for (int i = 0 ; i < str.length() ; i ++){
if (str.charAt(i)+5>'z'){
System.out.print((char)(str.charAt(i)+5-26));
}else{
System.out.print((char)(str.charAt(i)+5));
}
}
System.out.println();
}
}
感觉可以优化的地方有很多 以后有空会添加。
第二题
字符串截断输出:首先输入两个整数m,n,分别代表行数和长度,要求输出,将字符串截短成n长,不够补0,多了换行继续输出
【输入】: 2,8
1234567812345678123
asd
【输出】
12345678
12345678
12300000
asd00000
【代码一:我觉得不是很好因为在输入第一行字符串的时候就会给出结果,然后输入第二行。先贴出来吧】
package com.FORJOBS.SigaTest.HUAWEI;
import java.util.Scanner;
/*
* 字符串截断输出:首先输入两个整数m,n,分别代表行数和长度,要求输出,将字符串截短成n长,不够补0,多了换行继续输出
* 如输入: 2,8
* 1234567812345678123
* asd
* 输出
* 12345678
* 12345678
* 12300000
* asd00000
*/
public class Program_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n,m;
Scanner s = new Scanner(System.in);
n = s.nextInt();
m = s.nextInt();
for(int i = 0 ; i < n ; i ++){
String str =s.next();
StringBuffer s1 = new StringBuffer();
s1.append(str);
for(int j = 0 ;j<m-str.length()%m;j++){
s1.append('0');
}
for (int j = 0 ;j < s1.length();j++){
if ((j % m == 0)&&(j!=0)){System.out.println();}
System.out.print(s1.charAt(j));
}
}
}
}
【改进:将读进来的字符串全部存储,再做处理。】
package com.FORJOBS.SigaTest.HUAWEI;
import java.util.ArrayList;
import java.util.Scanner;
/*
* 字符串截断输出:首先输入两个整数m,n,分别代表行数和长度,要求输出,将字符串截短成n长,不够补0,多了换行继续输出
* 如输入: 2,8
* 1234567812345678123
* asd
* 输出
* 12345678
* 12345678
* 12300000
* asd00000
*/
public class Program_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n,m;
Scanner s = new Scanner(System.in);
n = s.nextInt();
m = s.nextInt();
ArrayList<String> as = new ArrayList<String>();
for(int i = 0 ; i < n ; i ++){
as.add(s.next());
}
for(int i = 0 ; i < n ; i ++){
StringBuffer s1 = new StringBuffer();
s1.append(as.get(i));
int k = s1.length();
for(int j = 0 ;j < m-(k % m);j++){
s1.append('0');
}
for (int j = 0 ;j < s1.length();j++){
if ((j % m == 0)&&(j!=0)){System.out.println();}
System.out.print(s1.charAt(j));
}
System.out.println();
}
}
}
第三题
求一个整型数组中元素的平均值,并统计其中大于和小于此平均值的元素的个数。
【输入】:整型数组中的元素个数及各个元素。
【输出】:整型数组中元素的平均值,大于和小于此平均值的元素的个数。
package com.FORJOBS.SigaTest.HUAWEI;
import java.util.ArrayList;
import java.util.Scanner;
/*
* 程序实现目标:求一个整型数组中元素的平均值,并统计其中大于和小于此平均值的元素的个数。
* 程序要求:输入:整型数组中的元素个数及各个元素。
* 输出:整型数组中元素的平均值,大于和小于此平均值的元素的个数。
*/
public class Program_3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
int n = s.nextInt();
ArrayList<Integer> numbers = new ArrayList<Integer>();
int sum = 0 , max = 0 , min = 0 ;
for (int i = 0; i < n;i ++ ){
numbers.add(s.nextInt());
sum += numbers.get(i);
}
double average = sum /numbers.size();
for (int i :numbers){
if (i > average) {max ++ ;}
if (i < average) {min ++ ;}
}
System.out.println(average+","+max+","+min);
}
}
第四题
手动输入一个存储整数的数组,要求输出数组里面的2个最大值。
【输入】:1,2,5,9,84,3,2
【输出】:84,9
【代码一:如果有重复数字则没有办法解决。】
package com.FORJOBS.SigaTest.HUAWEI;
import java.util.ArrayList;
import java.util.Scanner;
/*
* 手动输入一个存储整数的数组,要求输出数组里面的2个最大值。
* 输入:1,2,5,9,84,3,2
* 输出:84,9
*/
public class Program_4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
ArrayList<Integer> numbers = new ArrayList<Integer>();
while (s.nextInt()!= -1){
numbers.add(s.nextInt());
}
int MAX_1 = Integer.MIN_VALUE;
int MAX_2 = Integer.MIN_VALUE;
for (int i = 0 ;i<numbers.size();i++){
if (numbers.get(i)>MAX_1){
MAX_1 = numbers.get(i);
}
}
for (int i = 0 ;i<numbers.size();i++){
if ((numbers.get(i)>MAX_2)&&(numbers.get(i)<MAX_1)){
MAX_2 = numbers.get(i);
}
}
System.out.println(MAX_1+","+MAX_2);
}
}
【改进代码:将第一次找到的最大值赋值为Integer.MIN_VALUE 再查找就不怕出现重复】
package com.FORJOBS.SigaTest.HUAWEI;
import java.util.ArrayList;
import java.util.Scanner;
/*
* 手动输入一个存储整数的数组,要求输出数组里面的2个最大值。
* 输入:1,2,5,9,84,3,2
* 输出:84,9
*/
public class Program_4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
ArrayList<Integer> numbers = new ArrayList<Integer>();
int x = s.nextInt();
while (x!= -1){
numbers.add(x);
x = s.nextInt();
}
int MAX_1 = Integer.MIN_VALUE;
int MAX_2 = Integer.MIN_VALUE;
for (int i = 0 ;i<numbers.size();i++){
if (numbers.get(i)>MAX_1){
MAX_1 = numbers.get(i);
}
}
**for (int i = 0 ;i<numbers.size();i++){
if (numbers.get(i) == MAX_1){
numbers.set(i,Integer.MIN_VALUE );
break;
}
}**
for (int i = 0 ;i<numbers.size();i++){
if ((numbers.get(i)>MAX_2)&&(numbers.get(i)<=MAX_1)){
MAX_2 = numbers.get(i);
}
}
System.out.println(MAX_1+","+MAX_2);
}
}
第五题
回文数字判断。
题目描述:
有这样一类数字,他们顺着看和倒着看是相同的数,例如:121,656,2332等,这样的数字就称为:回文数字。编写一个函数,判断某数字是否是回文数字。
要求实现方法:
public String isPalindrome(String strIn);
【输入】strIn: 整数,以字符串表示;
【输出】true: 是回文数字;
false: 不是回文数字;
package com.FORJOBS.SigaTest.HUAWEI;
import java.util.Scanner;
/*
* 回文数字判断。
* 有这样一类数字,他们顺着看和倒着看是相同的数,
* 例如:121,656,2332等,这样的数字就称为:回文数字。
* 编写一个函数,判断某数字是否是回文数字。
* 要求实现方法:
* public String isPalindrome(String strIn);
* 【输入】strIn: 整数,以字符串表示;
* 【返回】true: 是回文数字;
* false: 不是回文数字;
* 【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
*/
public class Program_5 {
private static String isPalindrome(String str) {
// TODO Auto-generated method stub
for (int i = 0 ; i < str.length() / 2 - 1 ;i ++){
if (str.charAt(i) != str.charAt(str.length()-1-i)){
return "false";
}
}
return "true";
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
String str = s.next();
System.out.println(isPalindrome(str));
}
}
第六题
随机打印50个随机(4-10长度)的字符串,要求字符串包含的范围是所有的英文字母包含大小写和数字,按照编码顺序排序,每行打印4个,要求首字符对齐
【思路】:对于每个字符串的长度随机生成,然后再对该字符串的每个字符随机生成。在ASCLL表中0-9对应的48-57,A-Z对应的是65-90,a-z对应的是97-122。可以看出由于这三个字段并不连续。所以可以随机0,1,2进行对应判断。然后用堆排的方式进行排序。输出结果主要应用了String.format()。
package com.FORJOBS.SigaTest.HUAWEI;
import java.util.Random;
/*要求:
* 随机打印50个随机(4-10长度)的字符串,
* 要求字符串包含的范围是所有的英文字母包含大小写和数字,
* 按照编码顺序排序,
* 每行打印4个,
* 要求首字符对齐
*/
public class Program_6 {
static int max = 0;
private static void print(String[] str) {
// TODO Auto-generated method stub
for ( int i = 0 ; i< str.length; i ++ ){
if (( i % 4 == 0 )&&(i != 0)){System.out.println();}
System.out.printf("%-10s",str[i]);
}
}
private static void init(String[] str) {
// TODO Auto-generated method stub
Random r =new Random();
for ( int i = 0 ; i< str.length ; i ++ ){
int stringlen = r.nextInt(6)+4;
if ( stringlen > max ){ max = stringlen;}
StringBuffer s1 = new StringBuffer();
for ( int j = 0 ; j < stringlen ; j ++){
char c = 0;
int x = r.nextInt(2);
if ( x == 0){
c = (char) (r.nextInt(9)+48);//0-9的随机ascll码
}else if ( x == 1 ){
c = (char) (r.nextInt(25)+65);
}else if ( x == 2 ){
c = (char) (r.nextInt(25)+97);
}
s1.append(c);
}
str[i] = s1.toString();
}
}
private static void sort(String[] str) {
// TODO Auto-generated method stub
for ( int i = 0 ; i < str.length ; i++ ){
CreateHeap(str,str.length-1-i);
Swap(str,0,str.length-1-i);
}
}
private static void Swap(String[] str, int i, int j) {
// TODO Auto-generated method stub
String s = str[i];
str[i] = str[j];
str[j] = s;
}
private static void CreateHeap(String[] str, int lastindex) {
// TODO Auto-generated method stub
for (int i = (str.length-1) / 2 ; i >= 0 ; i--){
int k = i;
while ( 2 * k + 1 <= lastindex ){
int bigindex = 2 * k + 1;
if ( bigindex < lastindex){
if ( str[bigindex].compareTo(str[bigindex+1]) < 0 ){
bigindex++;
}
}
if ( str[k].compareTo(str[bigindex]) < 0 ){
Swap(str,k,bigindex);
k = bigindex;
}else {
break;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] str = new String[50];
init(str);
print(str);
sort(str);
print(str);
}
}
第七题
手动输入一个字符串,仅限小写字母,统计并输出每个字符在字符串中出现的次数,并输出。提示(可以用Map)
输入:aaabbbccc
输出:a 3
b 3
c 3
【思路 】 比较简单,就是利用了HashMap
package com.FORJOBS.SigaTest.HUAWEI;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
/*
* .手动输入一个字符串,仅限小写字母,统计并输出每个字符在字符串中出现的次数,并输出。提示(可以用Map)
* 输入:aaabbbccc
* 输出:a 3
* b 3
* c 3
*/
public class Program_7 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Character, Integer> hm = new HashMap<Character, Integer>();
Scanner s = new Scanner(System.in);
String str = s.next();
for (int i = 0; i <str.length();i++){
if (hm.containsKey(str.charAt(i))){
hm.put(str.charAt(i), (hm.get(str.charAt(i))+1));
}else{
hm.put(str.charAt(i), 1);
}
}
Set<Character> keys=hm.keySet();
for(Character c: keys){
System.out.println(c+" "+hm.get(c));
}
}
}
第八题
要求实现方法public String addTwoBigNumber(String s1,string s2)
大数相加,注意处理异常
public class Test{
public String addTwoBigNumber(String s1,string s2){
return "";
}
public static void main(String[] args){
Test test = new Test();
test.addTwoBigNumber("123456789","987654321")
}
}
【思路】其实很简单就是按位相加然后控制进位就可以了。
package com.FORJOBS.SigaTest.HUAWEI;
/*
* 大数相加
*/
public class Program_8 {
public String addTwoBigNumber(String s1,String s2){
StringBuffer str =new StringBuffer();
StringBuffer s3 =new StringBuffer();
if (s1.length() < s2.length() ){
str.append(s2);
s3.append(s1);
for ( int i = 0; i< s2.length()-s1.length();i++){
s3.insert(0, 0);
}
}else{
str.append(s1);
s3 .append(s2);
for ( int i = 0; i< s1.length()-s2.length();i++){
s3.insert(0, 0);
}
}
int c = 0;
int i ;
for ( i = s3.length()-1 ; i >= 0 ;i--){
int x = str.charAt(i)-48 + s3.charAt(i)-48 + c;
if ( x > 9 ){
c =1 ;
x -= 10;
str.setCharAt(i,(char) (x+48));
}else {c = 0;str.setCharAt(i,(char) (x+48));}
}
if (i == 0 && c> 0){
str.insert(0, c);
}
return str.toString();
}
public static void main(String[] args){
Program_8 test = new Program_8();
System.out.println(test.addTwoBigNumber("123456789","987654321"));
}
}
第九题
比较二维数组列最小值,组成一个新数组返回。(实现核心算法,不需要使用IO)
【输入】:intArr = {{5,6,1,16},{7,3,9}}
【输出】:intArrs ={1,3}
【思路】:没有什么好说的了,就是找两个最小值呗。
package com.FORJOBS.SigaTest.HUAWEI;
/*
* 比较二维数组列最小值,组成一个新数组返回。(实现核心算法,不需要使用IO)
* 输入:intArr = {{5,6,1,16},{7,3,9}}
* 输出:intArrs ={1,3}
*/
public class Program_9 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int [][] intArr = {{5,6,1,16},{7,3,9}};
int [] intArrs = new int [intArr.length];
getMin(intArr,intArrs);
for (int i = 0 ;i<intArrs.length-1;i++){
System.out.print(intArrs[i]+",");
}
System.out.print(intArrs[intArrs.length-1]);
}
private static void getMin(int[][] intArr, int[] intArrs) {
// TODO Auto-generated method stub
for (int i = 0;i<intArr.length;i++){
intArrs[i] = Integer.MAX_VALUE;
for (int j = 0 ; j<intArr[i].length;j++){
if (intArr[i][j]<intArrs[i]){
intArrs[i] = intArr[i][j];
}
}
}
Sort(intArrs);
}
private static void Sort(int[] a) {
// TODO Auto-generated method stub
for (int i = 0 ; i < a.length - 1 ;i ++){
for (int j = i + 1 ; j < a.length; j ++){
if (a[i] > a[j]){
int k = a[i];
a[i] = a[j];
a[j] = k;
}
}
}
}
}
第十题
键盘输入一句话,输出一句话中最长的单词,如果最长的出现多次,返回第一个。
这句话只包含数字字母和标点。
【输入】:a aa,cat tiger.123dd
【输出】: tiger
package com.FORJOBS.SigaTest.HUAWEI;
import java.util.ArrayList;
import java.util.Scanner;
/*
* 输入:a aa,cat tiger.123dd
* 输出: tiger
* 功能描述:键盘输入一句话
* 输出一句话中最长的单词,如果最长的出现多次,返回第一个。
* 这句话只包含数字字母和标点。
*/
public class Program_10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
String str = s.nextLine();
System.out.println(getLong(str));
}
private static String getLong(String str) {
// TODO Auto-generated method stub
ArrayList<String> as = new ArrayList<String>();
int k = 0;
int max = -1;
for (int i = 0 ; i< str.length();i++){
if (!Character.isLetter(str.charAt(i))){
as.add(str.substring(k, i));
k = i + 1;
}
}
for (int i = 0; i < as.size(); i++){
if (as.get(i).length()>max){
max = as.get(i).length();
}
}
int i;
for ( i= 0; i < as.size(); i++){
if (as.get(i).length()==max){
break;
}
}
return as.get(i);
}
}
第十一题
功能描述:将字符串中的字母全部替换成字母的下一个字母,
要是最后一位是z或Z则替换为a或A。
【输入】:aBxyZ
【输出】:bCyzA
package com.FORJOBS.SigaTest.HUAWEI;
import java.util.Scanner;
/*
* 功能描述:将字符串中的字母全部替换成字母的下一个字母,
* 要是最后一位是z或Z则替换为a或A。
* 输入:aBxyZ
* 输出:bCyzA
*/
public class Program_11 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
String str = s.next();
System.out.println(getString(str));
}
private static String getString(String str) {
// TODO Auto-generated method stub
StringBuffer s1 = new StringBuffer();
for ( int i = 0; i < str.length();i++){
if (str.charAt(i) == 'Z'){
s1.append("A");
}else if(str.charAt(i) == 'z'){
s1.append("a");
}else{
s1.append((char)(str.charAt(i)+1));}
}
return s1.toString();
}
}
第十二题
- 功能描述:判断一个字符串中是否只含有相同的子字符串(子串长度>=2)
- 输入:abab
- 返回:true
- 输入:abcd
- 返回:false
package com.FORJOBS.SigaTest.HUAWEI;
import java.util.Scanner;
/*
* 功能描述:判断一个字符串中是否只含有相同的子字符串(子串长度>=2)
* 输入:abab
* 返回:true
* 输入:abcd
* 返回:false
*/
public class Program_12 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
String str = s.next();
System.out.println(Check(str));
}
private static String Check(String str) {
// TODO Auto-generated method stub
String s2 ;
int x = 0;
for (int i = 2;i<=str.length()/2;i++){
s2 = str.substring(0, i);
x = 0;
if (str.length() % i!=0){
return "false";
}
for (int j = 0; j < str.length();j=j+i){
if (j+i>str.length()){
if (! s2.equals(str.substring(j))){
x = 1;
}
}
if (! s2.equals(str.substring(j,j+i))){
x = 1;
}
}
if (x == 0){
return "true";
}
}
return "false";
}
}