华为机试题【陆续更新】

1 篇文章 0 订阅
1 篇文章 0 订阅

华为之前的机试题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";
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值