华为OJ机试训练

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为OJ机试训练相关的知识,希望对你有一定的参考价值。

题目1 ——

通过输入英文句子。将每一个单词反过来,标点符号顺序不变。非26个字母且非标点符号的情况就可以标识单词结束。

标点符号包含,.!?

比如输入:Hello, I need an apple.

输出:

/**
 * 华为机试训练1: 通过输入英文句子,将每一个单词反过来。标点符号顺序不变。非26个字母且非标点符号的情况就可以标识单词结束。 标点符号包含,.!?
 * Hello, I need an apple.
 * 
 * @author snail
 * 
 */
public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String string = scanner.nextLine();
		scanner.close();
		String[] ssString = string.split("\\W+");
		String[] s2 = string.split("\\w+");

	int wordsNum = ssString.length;
	for (int i = 0; i < wordsNum; i++) {

	if (s2.length >= wordsNum) {
		int j = ssString[i].length() - 1;
		for (; j > -1; j--) {
			System.out.print(ssString[i].charAt(j));
		}
		System.out.print(s2[i + s2.length - wordsNum]);
	} else {

	System.out.print(s2[i - s2.length + wordsNum]);
	int j = ssString[i].length() - 1;
	for (; j > -1; j--) {
		System.out.print(ssString[i].charAt(j));
	}
	}

	}
	System.out.println();
	}

}

题目2——

实现“十七进制”转“十进制”算法:输入一个十七进制数字的字符串(字母一律大写),输出这个数值相应的十进制结果。达到进制转换目的,范围:0-0xFFFFFFFF。


我的程序——

/**
 * 实现“十七进制”转“十进制”算法:
 * 输入一个十七进制数字的字符串(字母一律大写),
 * 输出这个数值相应的十进制结果,达到进制转换目的,
 * 范围:0-0xFFFFFFFF。

* @author snail * */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String string = scanner.nextLine(); scanner.close(); double result = 0; int length = string.length(); double temp = 0; char tempChar = '0'; int bitvalue = 0; for (int i = 0; i < length; i++) { tempChar = string.charAt(length -i-1); if (!Character.isDigit(tempChar)) { if (tempChar>=0x40 && tempChar <=0x46) { bitvalue = tempChar - 0x41 +10; }else { bitvalue = tempChar - 0x61 +10; } }else { bitvalue = tempChar - 0x30; } temp = bitvalue * Math.pow(17, i); result += temp; } System.out.println(result); } }


题目3——

状态机——

背景:状态机在计算机各个领域中使用很广泛。最简单的状态机包括一组状态集(states)、一个起始状态(start state)、状态间转换条件(transition condition)。

 

要求:依据定义的脚本构造出状态机,并依据脚本进行状态迁移,或输出状态。

 

脚本包括例如以下keyword 

Insert  插入状态或迁移条件

语法是Insert 状态1,状态2,条件1

第一条Insert语句的第一个状态默觉得状态机的起始态。

假设状态1或状态2不存在,则新增状态1或状态2,假设状态1在条件1下已经存在其它迁移状态,则Insert失败。并输出Error字符串。

 

Delete 删除状态或迁移条件, 

语法是Delete 状态1/条件1

当删除状态1时。状态1所关联的全部条件全被删除,Delete起始态将删除整个状态机,删除当前活动状态时,无效并输出Error字符串,删除的条件或状态不存在,输出Error字符串。 

Input 状态机接收新条件 

语法是 Input 条件1

当前状态在条件1下有正确的迁移状态时。状态机迁移到下一个状态,假设在条件1下没有正确的迁移状态时。保持在当前状态,并输出Error字符串;假设当前状态机没有状态。相同输出Error字符串。

 

Output 输出当前状态 

语法是Output。假设当前状态机不存在。输出Error字符串,否则输出当前状态名.

  End 结束命令 

语法是End。收到该命令,脚本执行结束,忽略后面的脚本

 

  说明:输入脚本命令正确,不用考虑异常情况

例子输入:

Insert Sa,Sb,C1
Insert Sb,Sc,C2
Insert Sb,Sd,C3
Insert Sc,Se,C4
Insert Sd,Se,C5
Insert Se,Sa,C6
Input C1
Delete Sc
Input C2
Output
Input C3
Output
End


输出是 :

 

Error
Sb
Sd



我的程序——感觉写得非常垃圾,没有找到合适的方法来表示这个状态。懂的朋友请指点下。

package tree.test;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 状态机
 * 20:03 
 * @author snail
 * 
 */
public class Main {
	private static ArrayList<Status> statusList = new ArrayList<Main.Status>();
	private static String currentStatus ;
	 private static Status firstStatus ;
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String string = "";
		ArrayList<String> inputList = new ArrayList<String>();
		while(!(string=scanner.nextLine()).equals("End")){
			inputList.add(string);
		}
		int length = inputList.size();
		String temp = "";
		for (int i = 0; i < length; i++) {
			temp = inputList.get(i);
			if (temp.contains("Insert")) {
				insert(temp);
				
			}else if (temp.contains("Delete")) {
				delete(temp);
				System.out.println("debug-Delete --剩下"+statusList.size());
			}else if (temp.contains("Input")) {
			
				input(temp);
				System.out.println("当前状态:"+currentStatus.toString());
			}else if (temp.contains("Output")) {
				output();
				//System.out.println("Output"+statusList.toString());
			}
		}
		
		System.out.println();
	}
	
	private static void insert(String string){
		String[] ss = string.split(" "); 
		String dataString = ss[1];
		String[] insertStrings = dataString.split(",");
		String currentString = insertStrings[0];
		String nextString = insertStrings[1];
		String requireString = insertStrings[2];
		int size = statusList.size();
		boolean existFlag = false;
		for (int i = 0; i < size; i++) {
			if (statusList.get(i).getCurrentStatus().equals(currentString)&&
					statusList.get(i).getRequireString().equals(requireString)&&
					!statusList.get(i).getNextStatus().equals(nextString)
					 ) {
				existFlag = true;
				break;
			}
		}
		if (existFlag) {
			System.out.println("Error");
			return ;
		}else {
			Status status = new Status();
			status.setCurrentStatus(currentString);
			status.setRequireString(requireString);
			status.setNextStatus(nextString);
			if(statusList.size() == 0){
				firstStatus = status;
				currentStatus = currentString; 
			}
			statusList.add(status);
			
		}
		
	}
	
	/**
	 * 删除
	 * @author snail
	 *
	 */
	private static void delete(String string){
		String[] ss = string.split(" "); 
		String deleteString = ss[1];
	
		if (deleteString == currentStatus) {
			System.out.println("Error");
			return ;
		}else if(deleteString == firstStatus.getCurrentStatus()){
			statusList.clear();
			return ;
		}
	

		for (int i = 0; i < statusList.size(); i++) {
			Status status = statusList.get(i);
			//删除状态
			if (status.getCurrentStatus().equals(deleteString)) {
				for (int j = 0; j < statusList.size(); j++) {
					if (statusList.get(j).getNextStatus().equals(deleteString)) {
						statusList.get(j).setRequireString("");//删除有关的条件
						//statusList.remove(j);
					}
				}
				statusList.remove(i);
				return ;
			}
			//删除条件
			if (status.getRequireString().equals(deleteString)) {
				
				statusList.remove(i);
				return ;
			}
		}
	
		//不存在
		System.out.println("Error");
		return ;
	}
	
	private static void input(String string){
		String[] ss = string.split(" "); 
		String inputString = ss[1];
		if (currentStatus == null) {
			System.out.println("debug-input -- null");
			System.out.println("Error");
			return ;
		}
		ArrayList<Status> currentList = new ArrayList<Main.Status>();
		for (int i = 0; i < statusList.size(); i++) {
			if (statusList.get(i).currentStatus.equals(currentStatus)) {
				currentList.add(statusList.get(i));
			}
		}
		boolean exist = false;
		for (int i = 0; i < currentList.size(); i++) {
			//System.out.println("debug-input --require:"+currentStatus.requireString+",input :"+inputString);
			if (currentList.get(i).requireString.equals(inputString) ) {
				String nextString = currentList.get(i).getNextStatus();
			//	System.out.println("debug-input -- 当前状态中有该条件");
				//System.out.println("debug-input -- 下一个状态是"+nextString);
				int size = statusList.size();
				
				
				//寻找下一个状态
				for (int j = 0; j < size; j++) {
					if (statusList.get(i).getCurrentStatus().equals(nextString)) {
						currentStatus = statusList.get(j).getCurrentStatus();
						exist = true;
						break;
					}
				}
				
		}
		
			if (exist) {
				return ;
			}else {
				
			//	System.out.println("debug-input -- 没有该迁移状态");
				System.out.println("Error");
				return ;
			}}
		{
				//System.out.println("debug-input -- 没有该迁移条件");
				System.out.println("Error");
				return ;
			}	
			
		
	}
	
	private static void output(){
		if (currentStatus == null) {
			System.out.println("Error");
			return ;
		}else {
			System.out.println(currentStatus);
			return ;
		}
	}
	
	public static class Status{
		private String currentStatus;
		private String requireString;
		private String nextStatus;
		public String getCurrentStatus() {
			return currentStatus;
		}
		public void setCurrentStatus(String currentStatus) {
			this.currentStatus = currentStatus;
		}
		public String getRequireString() {
			return requireString;
		}
		public void setRequireString(String requireString) {
			this.requireString = requireString;
		}
		public String getNextStatus() {
			return nextStatus;
		}
		public void setNextStatus(String nextStatus) {
			this.nextStatus = nextStatus;
		}
		@Override
		public String toString() {
			return "Status [currentStatus=" + currentStatus
					+ ", requireString=" + requireString + ", nextStatus="
					+ nextStatus + "]";
		}
		
		
	}
}









以上是关于华为OJ机试训练的主要内容,如果未能解决你的问题,请参考以下文章

华为机试真题 Java 实现篮球比赛

华为机试真题 C++ 实现批量处理任务

华为机试真题 C++ 实现批量处理任务

2022华为机试真题 C++ 实现篮球比赛

华为机试 字符串最后一个单词的长度

华为OD机试真题Python实现篮球比赛真题+解题思路+代码(2022&2023)