一道上海华为的java面试题

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){
			//一次截长度为一的字符串,判断是否为中文字符,如果是则字节长度+2
			if(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在夺

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值