2个面试题 1、编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。2、如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 第一个题:java中的字符都是unicode表示,任一字符都是2字节.你上面的描述却认为字母a是1个字节.扫描字符串的每一个字符确认他们是汉字还是英文字母,然后确定怎样截取.第二题:把数字当作字符来存储,运算的时候把一个长字符截取成若干个短字符,再转换成数字来运算.例子:8855 + 667755 + 77 = 32 进1位88 + 66 = 154 + 1 = 155结果: 155 32 第一题实现:public String getSubString(String input,int number) throws UnsupportedEncodingException{ String tmpString = new String(input.getBytes("GB2312"),"ISO8859_1"); tmpString = tmpString.substring(0,number); return new String(tmpString.getBytes("ISO8859_1"),"GB2312"); } 1.查查ascII码知识,好像数字跟字母的值<256,汉字的值也在一个区间之内。截一个字符判断一下他的ascaII值就ok2.用bigdecimal作适配 谢谢: fire1_0(Steven) 小弟愚钝第一个题: 我只会如:String.subring(0,6)这样截取,不知道如何去判断是中文还是英文这次要把这两个问题搞清楚免得下次又不会 这是一个解,楼主可以试试:public String getSubString(String input,int number) throws UnsupportedEncodingException{ String tmpString = new String(input.getBytes("GBK"),"ISO8859_1"); tmpString = tmpString.substring(0,number); String p=new String(tmpString.getBytes("ISO8859_1"),"GBK"); String qq=""; byte bt[] =p.getBytes("GBK"); if((bt[bt.length-1])==63){ p = p.substring(0,p.length()-1); } return p; } if((bt[bt.length-1])==63)分析:中文转码时'?'、乱码的由来Byte-->Unicode, 如果Byte标识的字符在源代码集不存在,则得到的结果是0xfffd(63). 如:Byte ba[] = {(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1}; new String(ba,"gb2312"); 结果是"?啊", hex 值是"\ufffd\u554a". 0x8140 是GBK字符,按GB2312转换表没有对应的值,取\ufffd. (请注意:在显示该uniCode时,因为没有对应的本地字符,所以也适用上一种情况,显示为一个"?".)所以,在截取相应字符后,只需盘字符串最后一位是否为:0xfffd(63),是就截去就可以了。:-) fire1_0(Steven)回答的第一个问题是错误的。(unicode任一字符都是2字节)是错误的。拜托回答问题要多思考,付点责任。其实这两个问题如果仔细去分析都不简单。第二个问题fire1_0(Steven)的思路虽然可行,但一点都不好。建议楼主看看JDK源代码关于java.lang.Long类的实现。 谢谢各位大峡!Any better? 1.查查ascII码知识,好像数字跟字母的值<256,汉字的值也在一个区间之内。截一个字符判断一下他的ascaII值就ok2.用bigdecimal作适配难道我这个方法你还不满足???第一题我用javascript实现过,确认这种方法一定能行第二题看看java.math.BigDecimal,然后适配 再顶一下谢谢:armstronghp(@小旋风@) 第二个问题fire1_0(Steven)的思路虽然可行,但一点都不好。 建议楼主看看JDK源代码关于java.lang.Long类的实现。我看了半天也看不出什么东西出来 看不懂!第二题为什么java.math.BigDecimal,然后适配 如何实现的 不会写还得写真的很痛苦,资质太太平啊 关于二进制流的问题 List 的重组,报表统计中使用! 在一个panel里如何缩放一个图象 在线等 2道题大家帮忙答一下,最好能给解释一下,谢谢 graphics.drawImage(bufferedImage缩小画图出现锯齿,而原图很清晰。 JLabel.setBackground(Color)不生效,tell me why? [求助]请问英文资料的找法问题 URL的问题 LDAP问题在线等待 Java领域现在比较火的是什么? 请教大侠一个小数问题,急!在线等待!
java中的字符都是unicode表示,任一字符都是2字节.你上面的描述却认为字母a是1个字节.
扫描字符串的每一个字符确认他们是汉字还是英文字母,然后确定怎样截取.第二题:
把数字当作字符来存储,运算的时候把一个长字符截取成若干个短字符,再转换成数字来运算.
例子:
8855 + 6677
55 + 77 = 32 进1位
88 + 66 = 154 + 1 = 155结果: 155 32
String tmpString = new String(input.getBytes("GB2312"),"ISO8859_1");
tmpString = tmpString.substring(0,number);
return new String(tmpString.getBytes("ISO8859_1"),"GB2312");
}
2.用bigdecimal作适配
小弟愚钝
第一个题:
我只会如:String.subring(0,6)这样截取,不知道如何去判断是中文还是英文这次要把这两个问题搞清楚免得下次又不会
String tmpString = new String(input.getBytes("GBK"),"ISO8859_1");
tmpString = tmpString.substring(0,number);
String p=new String(tmpString.getBytes("ISO8859_1"),"GBK");
String qq="";
byte bt[] =p.getBytes("GBK");
if((bt[bt.length-1])==63){
p = p.substring(0,p.length()-1);
}
return p;
}
分析:中文转码时'?'、乱码的由来
Byte-->Unicode, 如果Byte标识的字符在源代码集不存在,则得到的结果是0xfffd(63).
如:
Byte ba[] = {(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1}; new String(ba,"gb2312");
结果是"?啊", hex 值是"\ufffd\u554a". 0x8140 是GBK字符,按GB2312转换表没有对应的值,取\ufffd. (请注意:在显示该uniCode时,因为没有对应的本地字符,所以也适用上一种情况,显示为一个"?".)
所以,在截取相应字符后,只需盘字符串最后一位是否为:0xfffd(63),是就截去就可以了。
:-)
(unicode任一字符都是2字节)是错误的。拜托回答问题要多思考,付点责任。
其实这两个问题如果仔细去分析都不简单。
第二个问题fire1_0(Steven)的思路虽然可行,但一点都不好。
建议楼主看看JDK源代码关于java.lang.Long类的实现。
Any better?
2.用bigdecimal作适配
难道我这个方法你还不满足???
第一题我用javascript实现过,确认这种方法一定能行
第二题看看java.math.BigDecimal,然后适配
第二个问题fire1_0(Steven)的思路虽然可行,但一点都不好。
建议楼主看看JDK源代码关于java.lang.Long类的实现。我看了半天也看不出什么东西出来
如何实现的