论坛首页 招聘求职论坛

上海华为的一次面试经历

浏览 68184 次
精华帖 (0) :: 良好帖 (1) :: 隐藏帖 (1)
作者 正文
   发表时间:2007-09-12  
引用
# 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。  
# 以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。


这道题目的意思很模糊。
首先j到底是什么变量?类的静态变量?实例变量?线程的局部变量?没有作用域的变量名是没有意义的。

第二,也许出题的人是想考synchronized关键字。可是就LZ写的程序看,在任意时间"j"的值是不可预测的,因为4个线程的执行顺序是不可预测的。那么即使不加synchronized,也不会使这种不可预测性发生质的变化。所以synchronized根本没有必要。
0 请登录后投票
   发表时间:2007-09-12  
回家的路上又想了一下,第二点我说得不对。

由于加法和减法符合交换律,所以虽然线程运行过程中j的值不可预测,但所有线程执行完毕后j的最终值还是可以预测的。但如果不加synchronized,这一点就做不到了。
0 请登录后投票
   发表时间: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思维不严谨,态度不认真为由不给你机会,呵呵

个人见解,请各位大大指教,谢谢。   
0 请登录后投票
   发表时间: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);
}

}
0 请登录后投票
   发表时间: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之间,来区分中文还是单字符, 不知是否可以。



0 请登录后投票
   发表时间: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位。
希望有所帮助。





试了试,确实这样!受益了
0 请登录后投票
   发表时间: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个字节
0 请登录后投票
   发表时间: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);
}


}   
这样是不是更方便呢
0 请登录后投票
   发表时间:2007-09-20  
去年到南京华为 面试过

Java题目也是比较简单

传值传引用之类


0 请登录后投票
   发表时间:2007-09-20  
:) 其实也不能怪lz, 出题的人没说清楚, bytes你也的说清楚基于什么charsetname, 如果是ISO88591, lz肯定没问题, 如果是charset(gb2312, GBK, BIG5), 就有问题拉,汉字在中确实占两个字节,问题的关键在于考虑截取长度的最后一个字节,如果是属于一个汉字的第一个字节,忽略即可。

华为在广州的时候,我也去面试过,大概有个六轮面试,最后因小弟的一些非面试上的问题, 没有去。 顺便问下老兄们, 一直从事Java工作快5年了,在广州工资大概能拿多少,刚刚从西部过来三个多月, 临时在一家外包公司, 不懂行情, 目前工资向人家要了个6k, 是不是很低?
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics