华为机试历年题

1.回文数的判读:

题目:

给定一个数,然后将其倒过来相加,如果和不是回文串,那么将和再采取同样的操作,判断这个数在7步之内能不能变成回文数,如果能,则输出这个回文数,如果不能,则输出0,变化规则如下述例子所示

例如 68

68+86=154

154+451=605

605+506=1111,

1111是回文数,输出1111.

代码:
import java.util.Scanner;


public class Demo1 {

	//给定一个数,然后将其倒过来相加,如果和不是回文串,
	//那么将和再采取同样的操作,判断这个数在7步之内能不能变成回文数,
	//如果能,则输出这个回文数,如果不能,则输出0,变化规则如下述例子所示
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		while(scan.hasNext()){
			int count = 7,sum;
			boolean flag = false ;
			int value = scan.nextInt();
			int value1 = change(value);
			sum = value+value1;
			
			while(count-->=0){
				flag = huiwen(sum);
				if(flag){
					System.out.println(sum);
					break;
				}
				sum = sum+change(sum);
			}
			if(!flag){
				System.out.println("0");
			}
			
		}
	}

	private static boolean huiwen(Integer sum) {//12321
	    //回文数是左右对称的
	    String str = sum.toString();
	    char[] arr = str.toCharArray();
	    for(int i=0;i<arr.length/2;i++){
	    	if(arr[i]!=arr[arr.length-i-1]){
	    		return false;
	    	}
	    }
		
		return true;
		
	}

	private static int change(Integer value) {
		
		String str = value.toString();
		StringBuffer sb = new StringBuffer();
		char[] arr = str.toCharArray();
		for(int i=arr.length-1;i>=0;i--){
			sb.append(arr[i]);
		}
		return Integer.parseInt(sb.toString());
	}

}



2.数组比较:

• 问题描述: 
比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数
比如:
数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0
数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3

• 要求实现函数: 
int array_compare(int len1, int array1[], int len2, int array2[])

【输入】 int len1:输入被比较数组1的元素个数;
int array1[]:输入被比较数组1;
int len2:输入被比较数组2的元素个数;
int array2[]:输入被比较数组2;
【输出】 无 
【返回】 不相等元素的个数,类型为int


代码:

import java.util.Scanner;


public class Demo2 {

	//比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,
	//如果2个数组长度不等,则只比较较短长度数组个数元素。
	//请编程实现上述比较,并返回比较中发现的不相等元素的个数
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		System.out.println("输入数组1的元素个数:");
		int len1 = scan.nextInt();
		int[] arr1 = new int[len1];
		
		System.out.println("输入数组1的元素:");
		for(int i=0;i<arr1.length;i++){
			int value1 = scan.nextInt();
		    arr1[i] = value1;
		}
		System.out.println("输入数组2的元素个数:");
		int len2 = scan.nextInt();
		int[] arr2 = new int[len2];
		
		System.out.println("输入数组2的元素:");
		for(int i=0;i<arr2.length;i++){
			int value2 = scan.nextInt();
			arr2[i] = value2;
		}
		
		int k = array_compare(len1, arr1,len2,arr2);
		System.out.println("不相等的元素个数为: "+k);
	}

	private static int array_compare(int len1, int[] arr1, int len2, int[] arr2) {
		
		int num = (len1>=len2?len2:len1);
		int count = 0;
		
		for(int i=len1-1,j=len2-1;num>0;i--,j--,num--){
			if(arr1[i]!=arr2[j]){
				count++;
			}
		}
		return count;
	}

}





3.编写函数string deletestring(string str,string sub_str)从str中查找匹配的字符串sub_str,采用最左匹配,且输出形式为str+"_"+匹配的次数:


代码如下:

import java.util.Scanner;


public class Demo3 {

	//编写函数string deletestring(string str,string sub_str)
	//从str中查找匹配的字符串sub_str,采用最左匹配,
	//且输出形式为str+"_"+匹配的次数:
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		System.out.println("输入str字符串:");
		String str = scan.next();
		
		System.out.println("输入sub_str字符串:");
		String sub_str = scan.next();
		
		int k = deletestring(str,sub_str);
		System.out.println(str+" "+k);
	}

	private static int deletestring(String str, String sub_str) {
		
		int len = sub_str.length();
		int count = 0 ;
		for(int i=0;i<str.length()-len;i++){
			String str1 = str.substring(i, len+i);
			if(str1.equals(sub_str)){
				count++;
			}
		}
		return count;
	}

}

4. 一副牌中发五张扑克牌给你:让你判断数字的组成:
有以下几种情况:
1:四条:即四张一样数值的牌(牌均不论花色)
2:三条带一对
3:三条带两张不相同数值的牌
4:两对
5:顺子  包括 10,J,Q,K,A
6:什么都不是

7:只有一对 


代码:(自我感觉效率很低,有更好的希望一起分享)

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;


public class Demo4 {

	//一副牌中发五张扑克牌给你:让你判断数字的组成:
	//有以下几种情况:
  //1:四条:即四张一样数值的牌(牌均不论花色)(有两组)
//	2:三条带一对(有两组)
//	3:三条带两张不相同数值的牌(有三组)
//	4:两对(有三组)
//	5:顺子  包括 10,J,Q,K,A(有五组)
//	6:什么都不是(有五组)
//	7:只有一对 (有四组)
	public static void main(String[] args) {
		
		String[] arr = new String[]{"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
		String[] arr1 = new String[5];
		Map<String,Integer> map = new HashMap<String, Integer>();
		
		for(int i=0;i<5;i++){
			int k = new Random().nextInt(arr.length);
			arr1[i] = arr[k];
		}
		System.out.println("随机的五张扑克为:");
		for(int i=0;i<5;i++){
			System.out.print(arr1[i]+" ");
		}
		
		if(arr1[0].equals("10")&&arr1[1].equals("J")&&arr1[2].equals("Q")&&arr1[3].equals("K")&&arr1[4].equals("A")){
			System.out.println("数字组成为:顺子");
		}
		for(int i=0;i<5;i++){
			Integer times = map.get(arr1[i]);
			map.put(arr1[i], times==null?1:times++);
		}
		
		Set<String> set = map.keySet();
		int size = set.size();
		int xiabiao = 0;
		System.out.println("size="+size);
		boolean flag1 = false;
		boolean flag2 = false;
		for(Iterator<String> it = set.iterator();it.hasNext();){
			String key = it.next();
			int value = map.get(key);
			if(value==4){
				flag1 = true;
			}
			if(value==3){
				flag2 = true;
			}
			
		}
		if(size==2){
			if(flag1){
				System.out.println("数字组成为:四条");
			}
			if(flag2){
				System.out.println("数字组成为:三条带一对");
			}
		}
		if(size==3){
			if(flag2){
				System.out.println("数字组成为:三条带两张不相同数值的牌");
			}else{
				System.out.println("数字组成为:两对");
			}
		}
		if(size==4){
			System.out.println("数字组成为:只有一对");
		}
		if(size==5){
			for(int i=0;i<arr.length;i++){
				if(arr[i]==arr1[0]){
					xiabiao=i;
					if(arr[xiabiao+1].equals(arr1[1])&&(xiabiao+1)<arr.length&&arr[xiabiao+2].equals(arr1[2])
							&&(xiabiao+2)<arr.length&&arr[xiabiao+3].equals(arr1[3])&&(xiabiao+3)<arr.length
							&&arr[xiabiao+4].equals(arr1[4])
							&&(xiabiao+4<arr.length)){
						System.out.println("数字组成为:顺子");
					}else{
						System.out.println("数字组成为:什么都不是");
					}
					break;
				}
			}
		}
	}

}


5.

我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:

 1、  长度13位;

2、  以86的国家码打头;

3、  手机号码的每一位都是数字。

 请实现手机号码合法性判断的函数要求:

1)  如果手机号码合法,返回0;

2)  如果手机号码长度不合法,返回1

3)  如果手机号码中包含非数字的字符,返回2;

4)  如果手机号码不是以86打头的,返回3;


代码如下:

import java.util.Scanner;


public class Demo5{

	//1)  如果手机号码合法,返回0;

//2)  如果手机号码长度不合法,返回1

//3)  如果手机号码中包含非数字的字符,返回2;

//4)  如果手机号码不是以86打头的,返回3;
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		while(scan.hasNext()){
			String inMsisdn = scan.next();
			
			int k = verifyMsisdn(inMsisdn);
			System.out.println(k);
		}
	}

	private static int verifyMsisdn(String inMsisdn) {
		
		char[] arr = inMsisdn.toCharArray();
		int flag = 0;
		
		if(arr.length!=13){
			flag = 1;
			return flag;
		}
		if(!inMsisdn.matches("^[0-9]*$")){
			flag = 2;
			return flag;
		}
		if(!inMsisdn.substring(0, 2).equals("86")){
			flag = 3;
			return flag;
		}
		return flag;
	}

}


你可能感兴趣的:(华为机试历年题)