题目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机试训练(一)的更多相关文章

  1. 华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)

    题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...

  2. 华为 2015 机试 输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的不要删除,例如,对应输出为:33aabb55pin。

    package 华为机试; //C++ 输入:由数字和字母组成的字符串,例如:333aaabb55ppin //输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的 ...

  3. 保研机试训练[bailianoj]

    site:http://bailian.openjudge.cn/xly2018/ 1.计算任意两天之间的天数 思路:以0为起始点计算天数,然后相减即可.这样的编码复杂度会减少很多. #include ...

  4. 华为JAVA机试流程

    1.JAVA机试流程:①打开IE浏览器,输入机试系统IP地址(以当天告知的地址为准):②输入姓名.手机,选择“C/C++”或“JAVA”,登录:③登录后显示题目,阅读题目并点击页面最下方的“下载框架文 ...

  5. 华为机试ACM(字符组合问题)

    今晚做了华为的机试,3道ACM题,最后一道是实现从M个不同字符中任取N个字符的所有组合. eg: input:ABC 2 output:AB AC BC 第一个输入为字符串,第二个输入为组合的字符个数 ...

  6. 2014华为机试西安地区B组试题

    2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.開始,电灯所有关着. 有n ...

  7. 华为机试001:字符串最后一个单词的长度(华为OJ001)

    华为机试 字符串最后一个单词的长度 计算字符串最后一个单词的长度,单词以空格隔开. 提交网址: http://www.nowcoder.com/practice/8c949ea5f36f422594b ...

  8. 2014华为机试西安地区A组试题

    2014华为机试西安地区A组试题 题目一.分苹果 M个同样苹果放到N个同样篮子里有多少种放法,同意有篮子不放. 1<=M<=10.1<=N<=10 比如5个苹果三个篮子,3,1 ...

  9. 【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

    原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年 ...

随机推荐

  1. JVM 看不到某些异常的stacktrace问题(转)

    在java 1.5的release notes里面可以看到这样一句话: The compiler in the server VM now provides correct stack backtra ...

  2. codevs1166 矩阵取数游戏

    题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个 ...

  3. linux grep练习

    1.显示/proc/meminfo文件中以不区分大小的s开头的行: 2.显示/etc/passwd中以nologin结尾的行; 3.显示/etc/inittab中以#开头,且后面跟一个或多个空白字符, ...

  4. linux内核交互,设备驱动控制管理接口

    1,ioctl preface--starting point ,format,mount volume,in addition to the above file system -- allows ...

  5. [笔记] /etc/init.d/ 下脚本的通用结构

    http://sunxiaqw.blog.163.com/blog/static/99065438201111715813443/ 下面以 named 为例 : #!/bin/bash # # nam ...

  6. hdu 5607 graph (矩阵乘法快速幂)

    考虑一个经典的问题: 询问从某个点出发,走 k 步到达其它各点的方案数? 这个问题可以转化为矩阵相乘,所以矩阵快速幂即可解决. 本题思路: 矩阵经典问题:求从i点走k步后到达j点的方案数(mod p) ...

  7. 充分利用HTML标签元素 – 简单的xtyle前端框架

    xtyle框架充分利用语义化标签来做美化样式,兼容多款主流浏览器,包括IE8. xtyle框架虽然没BS这么强大,但我觉得也很实用,体积不算很大,适用于企业网站.WordPress主题.个人网站.博客 ...

  8. Android appcompat备案

    使用Eclipse创建Android项目,project多出appcompat_v7,此情况在ADT升级到22.6.x版本后出现,22.3.x前版本不存在.此项为了实现向下兼容sdk的功能. 点击项目 ...

  9. Android 上多方式定位元素(python)

    Android 上多方式定位元素(python) 在学习实际UI自动化测试的时候,首先就需要定位元素,然而定位元素也是最头疼的地方,因为元素各种控件名称的缺失会影响元素的准确定位.下面针对Androi ...

  10. Oracle触发器Trigger2行级

    create table trigger_t2( id int, name ), age int ); /* --创建一个before update的触发器-控制每一行,行级 --只有行级的才会有:n ...