锁定老帖子 主题:上海华为的一次面试经历
精华帖 (0) :: 良好帖 (1) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-12
引用 # 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 # 以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 这道题目的意思很模糊。 首先j到底是什么变量?类的静态变量?实例变量?线程的局部变量?没有作用域的变量名是没有意义的。 第二,也许出题的人是想考synchronized关键字。可是就LZ写的程序看,在任意时间"j"的值是不可预测的,因为4个线程的执行顺序是不可预测的。那么即使不加synchronized,也不会使这种不可预测性发生质的变化。所以synchronized根本没有必要。 |
|
返回顶楼 | |
发表时间:2007-09-12
回家的路上又想了一下,第二点我说得不对。
由于加法和减法符合交换律,所以虽然线程运行过程中j的值不可预测,但所有线程执行完毕后j的最终值还是可以预测的。但如果不加synchronized,这一点就做不到了。 |
|
返回顶楼 | |
发表时间:2007-09-14
zhang26chao 写道 那道截取字符串的题目做的对不对啊?题目要求按字节截取字符串,"我ABC"按4个字节截取出"我AB",截取的字符串总共有4个字节。是我理解错了吗?
其实,LZ的代码没有完全对题,他用的是char,而不是byte,但是也不能说LZ的编程就有问题,通常面试试题考的是应聘者的编程能力,虽然LZ没有完全对题,但是就上面的代码而言是:40%切题分+60%编程能力分。这种情况就要看阅卷人的出发点了,如果严格按题目要求,LZ的答案就是错的,反之亦然。 我改了一下,应该可以切题: public void SplitIt() throws Exception { byte[] splitBytes = SplitStr.getBytes("GBK"); byte[] outBytes = new byte[SplitByte]; for(int i=0; i<SplitByte; i++){ outBytes[i] = splitBytes[i]; } System.out.println("OUT: " + new String(outBytes)); } 顺便YY一下:要是LZ到我们公司来面试,我可能会因为LZ思维不严谨,态度不认真为由不给你机会,呵呵 个人见解,请各位大大指教,谢谢。 |
|
返回顶楼 | |
发表时间:2007-09-20
个人感觉你哪个有点问题,看看我下面这个:
package com; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { static void fun(String str,int length){ Pattern pattern = Pattern.compile("[\u4e00-\u9fa5]"); System.out.println("输入的原始字符串为:" + str); System.out.println("输入的原始字符串长度为:" + str.length()); StringBuffer sb = new StringBuffer(); for (int i = 0; i < length; i++) { char[] c = new char[]{str.charAt(i)}; Matcher matcher = pattern.matcher(new String(c)); if (matcher.matches()){ // 先将汉字加上 sb.append(str.charAt(i)); // 如果是汉字将求的长度减短一位,因为汉字站两位 length--; }else{ // 不是汉字的情况 sb.append(str.charAt(i)); } } System.out.println("输出的结果字符串为:" + sb.toString()); } public static void main(String[] args){ Test.fun("t汉te汗st", 5); } } |
|
返回顶楼 | |
发表时间:2007-09-20
感觉lz第二道题有问题呀?人家要求输出的是字节数阿
引用:如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。 但按照lz的代码执行: SplitString ss = new SplitString("test中dd文dsaf中男大3443n中国43中国人0ewldfls=103",4); 结果: test 中dd文 dsaf 中男大3 443n 中国43 中国人0 ewld fls= 103 显示的结果却是字数。 偶得思路是:判断每个字节是否在0-127之间,来区分中文还是单字符, 不知是否可以。 |
|
返回顶楼 | |
发表时间:2007-09-20
liquidthinker 写道 liangwj72 写道 抛出异常的爱 写道 应该 是8 啊?
我 a b c 汉 d e f 一个char可以放下一个汉字。。。 他用的是getBytes(),不是toCharArray(),不应该是8,是10 不知道他的机器运行结果为什么是8。 我来解释一下,首先确定是说的getBytes(),以及由此的一些测试 在这个讨论中的字符集有两种情况: (1).java文件编码的字符集,默认是utf8,所以你可以用中文来命名类或者变量等等。metaphy所说的“代码编码”其实是指的这个,java文件的编码方式,仅此而已。所有语言平台下的这个默认字符集都是utf8,不管中文或者英文平台。 (2)j2se里面encode和decode使用的默认字符集,这个和jdk(jre?os?)有关,比如metaphy说的他是英文os,我猜想他的jdk也是英文的,encode和decode使用的默认字符集就是iso-8859-1(虽然他的java文件编码方式为utf8),在这个字符集里是不会认识中文的,因此getBytes()出来会是8位,中文和英文统一对待,原因就是iso-8859-1是西欧的,不会遇到用中文字符集编码解码。getBytes方法可以有一个字符串的参数,这个参数就是字符集,如果没有参数,那么默认使用平台字符集,在英文os下,有可能就是iso-8859-1了。 如果在中文平台下,由上面提到第2点知道getBytes()调用了中文平台的默认编解码字符集gbk,实际上相当于getBytes("gbk"),关于怎样构造字,一个汉字几位的问题暂不讨论,可以先明确的说gbk一个汉字两位,utf8一个汉字3位,具体原因可以搜索论坛上一个朋友写的东西(名字忘了,sorry),因此在中文平台下getBytes()或者getBytes("gbk")出来后是10位;同理getBytes("utf8")是12位。 希望有所帮助。 试了试,确实这样!受益了 |
|
返回顶楼 | |
发表时间:2007-09-20
metaphy 写道 String str = "我ABC汉DEF" ;
为什么我这字节长度显示为8? package test; public class StringBytesTest { /** * @param args */ public static void main(String[] args) { String str = "我ABC汉DEF" ; byte[] strb = str.getBytes() ; System.out.println (strb.length) ; byte[] byteNew = new byte[6] ; for (int i=0 ; i< 6 ;i++) { byteNew[i] = strb[i] ; } String strNew = new String(byteNew) ; System.out.println (strNew) ; } } 结果: 8 ?ABC?D 英文windows XP, JRE 1.5,eclipse 3.3,代码编码UTF-8. 我测试输出怎么是10呢,应该说是10个字节,虽然一个char能放下一个汉字,但是一个汉字还是占2个字节 |
|
返回顶楼 | |
发表时间:2007-09-20
class SplitString {
static void fun(String str,int length){ System.out.println("输入的原始字符串为:" + str); System.out.println("输入的原始字符串长度为:" + str.length()); StringBuffer sb = new StringBuffer(); for (int i = 0; i < length; i++) { char[] c = new char[]{str.charAt(i)}; if((new String(c).getBytes()).length==2){ // 先将汉字加上 sb.append(str.charAt(i)); // 如果是汉字将求的长度减短一位,因为汉字站两位 length--; }else{ // 不是汉字的情况 sb.append(str.charAt(i)); } } System.out.println("输出的结果字符串为:" + sb.toString()); } public static void main(String[] args){ SplitString.fun("t汉t汗st", 5); } } 这样是不是更方便呢 |
|
返回顶楼 | |
发表时间:2007-09-20
去年到南京华为 面试过
Java题目也是比较简单 传值传引用之类 |
|
返回顶楼 | |
发表时间:2007-09-20
:) 其实也不能怪lz, 出题的人没说清楚, bytes你也的说清楚基于什么charsetname, 如果是ISO88591, lz肯定没问题, 如果是charset(gb2312, GBK, BIG5), 就有问题拉,汉字在中确实占两个字节,问题的关键在于考虑截取长度的最后一个字节,如果是属于一个汉字的第一个字节,忽略即可。
华为在广州的时候,我也去面试过,大概有个六轮面试,最后因小弟的一些非面试上的问题, 没有去。 顺便问下老兄们, 一直从事Java工作快5年了,在广州工资大概能拿多少,刚刚从西部过来三个多月, 临时在一家外包公司, 不懂行情, 目前工资向人家要了个6k, 是不是很低? |
|
返回顶楼 | |