华为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机试训练(一)的更多相关文章
- 华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)
题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...
- 华为 2015 机试 输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的不要删除,例如,对应输出为:33aabb55pin。
package 华为机试; //C++ 输入:由数字和字母组成的字符串,例如:333aaabb55ppin //输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的 ...
- 保研机试训练[bailianoj]
site:http://bailian.openjudge.cn/xly2018/ 1.计算任意两天之间的天数 思路:以0为起始点计算天数,然后相减即可.这样的编码复杂度会减少很多. #include ...
- 华为JAVA机试流程
1.JAVA机试流程:①打开IE浏览器,输入机试系统IP地址(以当天告知的地址为准):②输入姓名.手机,选择“C/C++”或“JAVA”,登录:③登录后显示题目,阅读题目并点击页面最下方的“下载框架文 ...
- 华为机试ACM(字符组合问题)
今晚做了华为的机试,3道ACM题,最后一道是实现从M个不同字符中任取N个字符的所有组合. eg: input:ABC 2 output:AB AC BC 第一个输入为字符串,第二个输入为组合的字符个数 ...
- 2014华为机试西安地区B组试题
2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.開始,电灯所有关着. 有n ...
- 华为机试001:字符串最后一个单词的长度(华为OJ001)
华为机试 字符串最后一个单词的长度 计算字符串最后一个单词的长度,单词以空格隔开. 提交网址: http://www.nowcoder.com/practice/8c949ea5f36f422594b ...
- 2014华为机试西安地区A组试题
2014华为机试西安地区A组试题 题目一.分苹果 M个同样苹果放到N个同样篮子里有多少种放法,同意有篮子不放. 1<=M<=10.1<=N<=10 比如5个苹果三个篮子,3,1 ...
- 【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)
原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年 ...
随机推荐
- emacs使用指南
上大学的时候使用过几个简单的命令,用上windows后除了dos很少用命令行处理问题.现在MBP在手不用用emacs多可惜啊. 我上午搜索了下资料,都说emacs是神器,但是神不神看个人啦.这东西也不 ...
- logstash 分析nginx 错误日志
[root@dr-mysql01 frontend-error]# cat logstash_error.conf input { file { type => "zj_fronten ...
- rsyslog 同时发生nginx 访问日志和错误日志
input(type="imfile" File="/var/log/nginx/access.log" Tag="zjzc-frontend01-a ...
- 如何将Oracle安装为Linux服务
方法一:使用oracle自带的启动和关闭脚本 1. oracle用户修改/etc/oratab 文件: $ vi /etc/oratab orcl:/oracle/app/product/10.2.0 ...
- Centos下编译Linux内核
Linux内核编译是一件简单却费事的事.但是独立的编译linux内核会帮助你很好的理解Linux内核的工作机理. 首先编译linux内核我们需要在当前linux操作系统下安装gcc编译器,因为我是Ce ...
- POJ3307+找规律
/* 题意:求第N个productivity property数是谁. (productivity property数:就是这个数可以由另外的数的各个位上的乘积得到.) */ #include< ...
- mesos博客集
http://dongxicheng.org/category/apache-mesos/
- 字符串对比.net String.EndsWith方法 (String)
string str="web/abc.aspx"; if(str.EndsWith("abc.aspx")) { 此方法将 value 与位于此实例末尾.与 ...
- Mvc4.0添加商品到Cookie
/// <summary> /// 添加Cookie /// </summary> /// <param name="gc">GoodsToCo ...
- MYSQL报Fatal error encountered during command execution.错误的解决方法
{MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during command executio ...