一道上海华为的java面试题

来源:互联网 发布:js 文本域赋值后光标 编辑:程序博客网 时间:2024/04/30 13:18
package com.test.main;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 编写一个截取字符串的函数,输入为一个字符串和字节数, * 输出为按字节截取的字符串。 但是要保证汉字不被截半个, * 如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6, * 应该输出为“我ABC”而不是“我ABC+汉的半个”。 * 该题关键在于截的位置,如果知道位置我们便可以用subString(0,len) * 来截取了,根据题目按字节截,如果是中文就是两个字节,那我们可以从头开始算 * 长度,一个中文算两个一个项文算一个,直到字节长度比他要求截的长度长为止。 * @author jiangzhj * */public class TestZH {/** * @param args */public static void main(String[] args) {TestZH test = new TestZH();//源字符串String str = "中dd文dsaf中男大3443n中国43中国人0ewldfls=103在夺";System.out.println(str.getBytes().length);for(int i =1 ;i <=str.getBytes().length;i++){String s = test.getSubLength(str,i);System.out.println("i:"+i+"substr="+s);}}/** * 判断是否为中文 * 是返回true * 这里根据正则表达式来判断, * 这里会有很多不同方法来判断中文, * 此方法来自网络 * 如果大家有其他方法可以替换 * @param str * @return */public boolean isZhChar(String str){boolean flag = false;String reg = "[\u4e00-\u9fa5]";Pattern p = Pattern.compile(reg);Matcher m = p.matcher(str);flag = m.find();return flag;}/** * 计算字符串需要截取的长度 * 给了两个变量p1,p2,p1一个是记录字符串长度,此长度就是最后返回的 * p2是字节长度,把这个长度与给定的长度比较,当p2的长度>=给定长度时就 * 跳出循环 * @param str * @param len * @return */private String getSubLength(String str,int len){if(str.getBytes().length==len){return str;}//字符串长度int p1=0;//字节长度int p2=0;while(p2<len){//一次截长度为一的字符串,判断是否为中文字符,如果是则字节长度+2if(isZhChar(str.substring(p1, p1+1))){p2+=2;//如果字节长度大于给定长度则跳出循环,if(p2>len){break;}}else{p2+=1;}++p1;}return str.substring(0,p1);}}


此题是网上网友提供,我在这里贴贴我的代码,请各位多多指教

题目:编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。

 

运行结果

49
i:1substr=
i:2substr=中
i:3substr=中d
i:4substr=中dd
i:5substr=中dd
i:6substr=中dd文
i:7substr=中dd文d
i:8substr=中dd文ds
i:9substr=中dd文dsa
i:10substr=中dd文dsaf
i:11substr=中dd文dsaf
i:12substr=中dd文dsaf中
i:13substr=中dd文dsaf中
i:14substr=中dd文dsaf中男
i:15substr=中dd文dsaf中男
i:16substr=中dd文dsaf中男大
i:17substr=中dd文dsaf中男大3
i:18substr=中dd文dsaf中男大34
i:19substr=中dd文dsaf中男大344
i:20substr=中dd文dsaf中男大3443
i:21substr=中dd文dsaf中男大3443n
i:22substr=中dd文dsaf中男大3443n
i:23substr=中dd文dsaf中男大3443n中
i:24substr=中dd文dsaf中男大3443n中
i:25substr=中dd文dsaf中男大3443n中国
i:26substr=中dd文dsaf中男大3443n中国4
i:27substr=中dd文dsaf中男大3443n中国43
i:28substr=中dd文dsaf中男大3443n中国43
i:29substr=中dd文dsaf中男大3443n中国43中
i:30substr=中dd文dsaf中男大3443n中国43中
i:31substr=中dd文dsaf中男大3443n中国43中国
i:32substr=中dd文dsaf中男大3443n中国43中国
i:33substr=中dd文dsaf中男大3443n中国43中国人
i:34substr=中dd文dsaf中男大3443n中国43中国人0
i:35substr=中dd文dsaf中男大3443n中国43中国人0e
i:36substr=中dd文dsaf中男大3443n中国43中国人0ew
i:37substr=中dd文dsaf中男大3443n中国43中国人0ewl
i:38substr=中dd文dsaf中男大3443n中国43中国人0ewld
i:39substr=中dd文dsaf中男大3443n中国43中国人0ewldf
i:40substr=中dd文dsaf中男大3443n中国43中国人0ewldfl
i:41substr=中dd文dsaf中男大3443n中国43中国人0ewldfls
i:42substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=
i:43substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=1
i:44substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=10
i:45substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=103
i:46substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=103
i:47substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=103在
i:48substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=103在
i:49substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=103在夺

以上这种方法有点通俗,本人写完后总感觉不是太好。于是又写下以下这道。呆会再贴上来。

原创粉丝点击