罗马数字加法实现Roman Calculator
最后更新于:2022-04-01 21:06:39
开发一款程序教小孩子认识罗马数字,小孩子已经对罗马数字非常熟悉了,但是不明白罗马数字的加法,在[面试技能六](http://blog.csdn.net/dotnetstudio/article/details/40111043)中已经对罗马数字的构成做了详细描述。现在做的程序也是在面试技能六的约束下,加法的求和最大限定在3000以内。
~~~
///
/// 罗马数字转十进制数
///
///
///
public static int ConvertRomanToDecimal(string number)
{
Dictionary dic = new Dictionary();
dic.Add("M", 1000);
dic.Add("CM", 900);
dic.Add("D", 500);
dic.Add("CD", 400);
dic.Add("C", 100);
dic.Add("XC", 90);
dic.Add("L", 50);
dic.Add("XL", 40);
dic.Add("X", 10);
dic.Add("IX", 9);
dic.Add("V", 5);
dic.Add("IV", 4);
dic.Add("I", 1);
int len = number.Length;
if (len == 1)
{
return dic[number];
}
if (len > 1)
{
int i = 0;
int sum = 0;
while (i < len)
{
int step = 1;
if (len - i > 1)
{
step = 2;
}
string cnum = number.Substring(i, step);
if (dic.ContainsKey(cnum))
{
sum += dic[cnum];
i = i + step;
}
else
{
sum += dic[number.Substring(i, 1)];
i = i + 1;
}
}
return sum;
}
return -1;
}
}
~~~
~~~
///
/// 十进制转罗马数字
///
///
///
public static string ConvertDecimalToRoman(int number)
{
int[] decArray = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
string[] romAarry = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
int i = 0;
string output = "";
while (number > 0)
{
while (number >= decArray[i])
{
number = number - decArray[i];
output = output + romAarry[i];
}
i++;
}
return output;
}
~~~
~~~
///
/// 加法器
///
/// 输入罗马加法公式
///
public static string RomanCalculator(string s)
{
string[] array = s.Split('+');
int sum = ConvertRomanToDecimal(array[0].Trim()) + ConvertRomanToDecimal(array[1].Trim());
return ConvertDecimalToRoman(sum);
}
~~~
调用RomanCalculator()函数,输入如下的测试数据进行测试。
Input Output
XX + II XXII
I + V VI
II + II IV
CCC + CCC DC
D + D M
';
面试技能六
最后更新于:2022-04-01 21:06:37
用C#写一个RomanNumbers的控制台程序,提供基本罗马数字到十进制数的映射关系,然后给出一些约束,然后对于1到5000的十进制整数,能转换成相应的罗马数字。
基本罗马数字和十进制数的对应关系
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
约束
1. 如果一个代表数字小的字母放在代表数字大的字母的前面,则表示减法,例如CM就表示900
2. 一个字母最多只能重复3次
程序
~~~
public static string ConvertDecimalToRoman(int number)
{
int[] decArray = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
string[] romAarry = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
int i = 0;
string output = "";
while (number > 0)
{
while (number >= decArray[i])
{
number = number - decArray[i];
output = output + romAarry[i];
}
i++;
}
return output;
}
~~~
测试数据
7 VII
1981 MCMLXXXI
99 XCIX
700 DCC
经测试,测试数据全部通过。
';
面试技能五
最后更新于:2022-04-01 21:06:35
用C#写一个CheckWriter的控制台程序,如果你在银行工作,需要一个系统能够当你输入一串数字金额后能用其对应的英文输出,这样方便打印在支票上防止篡改。用户输入一个0到20亿的数字包含最多2位小数,将其转换为英文输出。例如输入1258276.25,能够输出:one million, three hundred and fifty seven thousand, two hundred and fitty six DOLLARS AND thirty two CENTS.
~~~
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CheckWriter
{
class Program
{
private static string[] _lessTwentyNumbers = new string[]{"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight",
"Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen","Sixteen", "Seventeen", "Eighteen", "Nineteen"};
private static string[] _lessHundredNumbers = new string[]{"", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty","Ninety"};
private static string[] _scaleNumbers = new string[] { "", "Thousand", "Million", "Billion" };
static void Main(string[] args)
{
string s = ConvertDecimalToWords(1258276.25);
Console.WriteLine(s);
Console.Read();
}
///
/// 将数字转为英文描述
///
///
///
private static string ConvertNumberToWords(int number)
{
if (number == 0)
{
return _lessTwentyNumbers[0];
}
int[] digitGroups = new int[4];
int positive = Math.Abs(number);
// 将数字按三位一段保存到数组里
for (int i = 0; i < 4; i++)
{
digitGroups[i] = positive % 1000;
positive /= 1000;
}
string[] groupText = new string[4];
for (int i = 0; i < 4; i++)
{
// 每三位一段转为相应的英文字符
groupText[i] = ConvertThreeDigitToWords(digitGroups[i]);
}
string combined = groupText[0];
for (int i = 1; i < 4; i++)
{
if (digitGroups[i] != 0)
{
// 每一段加上相应的这一段的级别数字
string prefix = groupText[i] + " " + _scaleNumbers[i];
if (!string.IsNullOrEmpty(prefix))
{
if (string.IsNullOrEmpty(combined))
{
combined = prefix;
}
else
{
combined = prefix + ", " + combined;
}
}
}
}
if (number < 0)
{
combined = "Negative " + combined;
}
return combined;
}
///
/// 处理三位数以内的数字转为英文描述
///
///
///
private static string ConvertThreeDigitToWords(int threeDigits)
{
string groupText = "";
// 获取百位
int hundreds = threeDigits / 100;
int tensUnits = threeDigits % 100;
if (hundreds != 0)
{
groupText += _lessTwentyNumbers[hundreds] + " Hundred";
if (tensUnits != 0)
{
groupText += " and ";
}
}
// 获取十位
int tens = tensUnits / 10;
int units = tensUnits % 10;
if (tens >= 2)
{
groupText += _lessHundredNumbers[tens];
if (units != 0)
{
groupText += " " + _lessTwentyNumbers[units];
}
}
else if (tensUnits != 0)
{
groupText += _lessTwentyNumbers[tensUnits];
}
return groupText;
}
private static string ConvertDecimalToWords(double number)
{
int i = (int)number;
int p = (int)((number - i) * 100);
return ConvertNumberToWords(i) + " DOLLARS AND " + ConvertNumberToWords(p) + " CENTS";
}
}
}
~~~
上面的代码中两个核心函数是ConvertNumberToWords和ConvertThreeDigitToWords,ConvertThreeDigitToWords的作用主要是能将小于1000的整数转为相应的金额,而ConvertNumberToWords负责将不同段的金额组合成完整的金额,主要是加上了该金额对应的位,例如本程序由于只要求对20亿以内的数字进行处理,因此分为千,百万和十亿三档。理解好了这两个函数基本就能知道是怎么做的。
';
面试技能四
最后更新于:2022-04-01 21:06:33
## 1. ArrayList 和 LinkedList 的使用如何选择?
很多人回答二者不同的时候会认为ArrayList不像链表那样可以灵活的增加元素或者删除元素,但二者都提供了下面的方法可以灵活增加元素:
~~~
public void add(int index, E element)
~~~
另外LinkedList还提供了offer方法可以在前后增加元素
~~~
public boolean offerFirst(E e)
public boolean offerLast(E e)
~~~
如果要是从尾部删除元素,那么LinkedList将是不错的选择,因为下面的方法是它独有的。
~~~
public E removeLast()
//Retrieves and removes the last element of this list, or returns null if this list is empty.
public E pollLast()
~~~
## 2. 为什么重写类的equals方法,还要同时重写hashcode方法?
保证两个等价对象得到相同的hashcode
## 3. SerialVersionUID的作用
在运行时判断类的SerialVersionUID验证版本的一致性
## 4. java的 check 和 uncheck 异常的区别是什么?
check exception是exception的子类,这类异常必须通过try-catch进行处理,否则无法编译通过,而uncheck exception是runtime exception的子类,这类异常可以不捕获,直接向外抛出,让外界处理。
## 5. 简要介绍jvm的垃圾回收机制
1)标记清除:遍历对象图标记可到达的对象,然后扫描堆栈,发现未标记的对象并释放内存;
2)分代回收:将内存区域分为新生代和旧生代,使用复制算法扫描出存活对象并复制到新的未使用的空间中,指针保存在最后一个分配对象所处的位置,当新生代满了之后,就全部转移到旧生代,清空新生代区域,继续装载,直至最后内存溢出。
## 6. jvm内存模型
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/3749df38a0a7892d1ff08c3c57024371_480x341.jpg)
1)方法区:虚拟机加载的类信息、常量、静态变量,所有线程共享该内存区域
2)虚拟机栈:方法执行时都会创建一个栈帧,用于存储局部变量表包括方法参数、操作栈和方法出口等信息
3)本地方法栈:为Native方法服务
4)堆:被所有线程所共享,存储了所有new的对象
5)程序计数器:选取下一条需要执行的字节码指令,分支、循环、异常处理都需要它完成
## 7. 如何理解面向对象的开闭原则
一个软件实体如类、模块和函数应该对扩展开发,对修改关闭。
## 8. 简单介绍JS的事件冒泡
事件冒泡指的是子级元素先触发,父级元素后触发,事件捕获与之相反。W3C标准同时支持两种方式,任何事件发生,从顶层元素开始事件捕获直达事件发生的源元素,然后从事件源向上冒泡。可以通过addEventListener()对元素进行监听,最后一个参数为true是事件捕获。
## 9. 介绍利用log4j配置日志
## 10. 如何基于spring配置数据库事务
## 11. 介绍使用的数据库连接池配置
## 12. 抽象类可以在spring中定义成一个bean吗
';
面试技能三
最后更新于:2022-04-01 21:06:30
## 题目1:请描述Post请求和Get请求的区别以及二者一般应用场景
Post请求和Get请求都是向服务器获取数据的请求,Get是通过URL向服务器发送获取数据的请求,Post是把要提交的数据放在HTTP包体中向服务器提交数据的请求。二者理论上都没有长度限制,例如IE浏览器对URL的长度限制为2KB。Post请求比Get请求安全性更高,因为Get请求通过URL实现,用户名和密码很容易暴露,所以在传参的时候一定要加密。可以采用Base64()进行编解码。
~~~
var b = new Base64();
b.encode(pwd)
b.decode(pwd)
~~~
这篇文章对于二者的分析比较到位:[话说GET与POST那点恩怨](http://blog.csdn.net/liujiahan629629/article/details/17585899)
## 题目2:请说明forward和redirect的主要区别
forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户端无需知道;redirect则是服务器收到请求后发生一个状态头给用户,用户再次请求,这样会有两次客户端到服务端的通信,由于是再次请求,因此上一个jsp的信息不被保留。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/91de7f7fd9abcbbcaa2d188c152e5a70_592x195.jpg)
题目3:请写出以下javascript代码的执行结果
~~~
var a1 = 10; var a2 = 20;
var r1 = "a1+a2=" + a1 + a2;
var str1 = "I am a soft engineer";
var r2 = str1.substring(9, 14);
document.write(r1);
document.write("%");
document.write(r2);
~~~
结果是:a1+a2=1020%ft en
## 题目4:请写出以下javascript代码的执行结果,并说明原因
~~~
function Person(name) {
this.name = name;
this.move = function () { alert("Prepare move for person [" + this.name + "]") };
}
Person.prototype.move = function () { alert("Ready move for person [" + this.name + "]") };
$(function () {
var person = new Person("Jim");
person.move();
});
~~~
执行的结果是:Prepare move for person [Jim]
个人觉得原因是由于对象如果自带有move()方法就不会向原型链查找。
';
面试技能二
最后更新于:2022-04-01 21:06:28
## 1 EJB中有几种Bean,叙述有状态Bean和无状态Bean的区别。
答:EJB中有Session Bean,Entity Bean,以及 Message Driven Bean。这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。
## 延伸问题
1.1 几种Bean的作用
答:SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。Message Driven Bean用来处理基于消息请求的组件。
1.2 Session Bean和Entity Bean的区别
答:对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
## 2 HTTP协议的完成请求以及相应格式是什么?
答:HTTP协议的格式是http://host[:port][abs_path],例如http://192.168.0.1:8080/index.jsp。HTTP的请求由请求行、消息报头、请求正文组成,请求行格式:Method Request-URI HTTP-Version CRLF,其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行。
## 延伸问题
2.1 HTTP协议定义
答:HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式。
2.2 HTTP协议的特点
答:无连接:无连接的含义是限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
2.3 HTTP协议有哪些请求方法
GET:请求获取Request-URI所标识的资源
POST:在Request-URI所标识的资源后附加新的数据
HEAD:请求获取由Request-URI所标识的资源的响应消息报头
PUT:请求服务器存储一个资源,并用Request-URI作为其标识
DELETE:请求服务器删除Request-URI所标识的资源
TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
## 3 接口和抽象类有什么区别,抽象类中可以有非抽象方法吗?
区别:1)一个类只能继承一个抽象类但可以实现多个接口
2)接口是抽象类的变体,接口中所有方法都是抽象的,而抽象类是声明方法的存在,而不去实现的类
3)接口定义方法但不能实现,抽象类可以实现部分方法
4)接口中基本数据类型是static,但抽象类不是
抽象类中可以有抽象方法也可以有非抽象方法,抽象方法用于不同子类实现不同的方法,非抽象方法用于所有子类共享该方法,不需要重写。
## 4 Servlet如何注入Service?
答:写一个委托的Bean,用Spring采用注解的方式将服务注入到Servlet中。具体参见[http://www.oschina.net/question/111042_74534](http://www.oschina.net/question/111042_74534)
## 5 什么叫数据库的脏读
答:一个事务读到另外一个事务还没有提交的数据
延伸问题:
5.1 不可重复读
答:一个事务先后读取同一条记录,但两次读的数据不同
## 6 在weblogic中发布ejb需涉及到哪些配置文件
答:ejb-jar.xml和weblogic-ejb-jar.xml
## 7 如何在weblogic中配置数据源
见[http://blog.csdn.net/weijie_search/article/details/2756585](http://blog.csdn.net/weijie_search/article/details/2756585)
## 8 对于WebService中的CXF实现如何根据服务端的WSDL描述文件生成对应的客户端代码,并作解释。
## 9 如何解释Spring的DI,AOP等定义
答:DI即dependency injection,程序在运行的时候动态的生成对象、执行对象的方法,改变对象的属性,spring就是通过反射来实现注入的。AOP即Aspect-oriented programming,该模块为基于Spring的应用程序中的对象提供事务管理服务,通过AOP,不依赖EJB组件,就可以将声明性事务管理集成到应用程序中。
## 10 编写数据库存储过程或者函数,要求查询某张表中的限定数据。
这个题我真不知道出题者想考察什么,难道是存储过程的格式?
';
面试技能一
最后更新于:2022-04-01 21:06:26
## 题1:写一个函数,任意输入一个字符串,如果两个字符之间有多个空格字符,那么仅保留一个空格字符,例如“abc abc”,输出“abc abc”。
~~~
/**
* 返回一个字符串,将原有字符串中多个连续空格只保留一个
* @param s
* @return
*/
public static String checkSpace (String s) {
// \s 匹配的是任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格
return s.replaceAll("\\s{1,}", " ");
}
~~~
## 题2:写一个函数,输出一个文件夹下所有文件的名称
~~~
/**
* 输出一个文件夹下所有的文件名称
* @param path
*/
public static void outputFiles(String path) {
File parent = new File(path);
if(!parent.exists())
{
System.out.println("path is not exist");
return;
}
File[] childs=parent.listFiles();
for(int i=0;i
';
前言
最后更新于:2022-04-01 21:06:24
> 原文出处:[面试宝典之人在江湖](http://blog.csdn.net/column/details/face.html)
作者:[dotnetstudio](http://blog.csdn.net/dotnetstudio)
**本系列文章经作者授权在看云整理发布,未经作者允许,请勿转载!**
# 面试宝典之人在江湖
> 人在江湖,身不由己。找工作,面试,拒与被拒,都是因为天下没有一种武功让我们一统江湖,千秋万代。我经历过被拒的苦闷,也经历过拒绝offer的快感,希望将自己面试所得所思与诸位分享,希望大家通过技能的提升去成就自己。
';