`
Quenice
  • 浏览: 15408 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

含中文字符的字符串截取(面试题)

    博客分类:
  • java
阅读更多

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

 

1、原理

我们知道,根据编码的不同,汉字在字符串中所占字节也不一样,如果是UTF-8编码,汉字占3个字节,如果是GBK编码(本文利用的是GBK编码的实现),汉字占2个字节。但是,英文单词在字符串中,始终占用1个字节。所以,把字符串先转化为字符数组和字节数组,然后同时遍历两个数组,比较在数组同位置的值是否相等,如果相等,那么说明该字符是英文字符,如果不相同则说明该字符是中文字符,同时记录下来。大致原理就是这样的,大家看代码实现

 

2、代码实现

 

/**
 * @author Quenice
 */
public class StringSplit {
	public static void main(String[] args) throws Exception {
		System.out.println(split("a好a嗯哦",3));
	}
	
	public static String split(String str, int byteNum) throws Exception {
		String ret = null;
		/*
		 * 转换为字符数组,数组中的元素可能是英文字符,也可能是中文字符
		 */
		char[] charArr = str.toCharArray();
		/*
		 * 以GBK编码转换为字节数组,数组元素可能是英文也可能是半个中文,
		 * 如果字符串全部是英文字符的话,那么转换之后的效果其实和转换为字符数组是一个意思
		 */
		byte[] byteArr = str.getBytes("GBK");
		//在拆分个数范围(即byteNum)内,计算字节数组中有多少半个汉字
		int notCharLen = 0;
		for(int i = 0;i < byteNum;i ++) {
			if(i > charArr.length - 1) {
				notCharLen ++;
			} else {
				/*
				 * 比较字符数组和字节数组对应的元素是否相等,不等说明是半个汉字,notCharLen++,相当说明是英文字符,不操作
				 * charArr[i - notCharLen/2]就是对应于第i个字节
				 */
				if(charArr[i - notCharLen/2] != byteArr[i]) {
					notCharLen ++;
				}
			}
		}
		
		if(notCharLen%2 == 0) {//如果是2的膜,说明正好不用拆封汉字
			ret = str.substring(0,byteNum - notCharLen/2);
		} else {//需要拆封汉字
			ret = str.substring(0,byteNum - notCharLen/2 - 1);
		}
		return ret;
	}
}

  

2
2
分享到:
评论
7 楼 lsfws 2013-07-04  
牛B。。。。
6 楼 Quenice 2013-07-02  
OK,谢谢提醒,注释已加上
thihy 写道
CodePoint!!!

5 楼 Quenice 2013-07-02  
hailongshih 写道
lz能否把注释写清楚,有些看不懂

不好意思啊,这几天比较忙,没时间搞这个~
4 楼 hailongshih 2013-07-02  
不错,谢谢lz,我看懂了
mrzhanghao 写道
通过toCharArray获取到字符数组,通过getBytes获得字节数组.
开始循环,如果两个数组的下标charArr[i - notCharLen/2]=i(这时notCharLen=0)相同的元素值相等,说明是英文字母,略过.
如果不同,说明在字节数组中这是汉字的前面半个.使得notCharLen++.
下次判断charArr[i - notCharLen/2]就将字节数组中的汉字计算在内了,两个数组的下标比较又在同一起跑线上了.

3 楼 mrzhanghao 2013-07-02  
通过toCharArray获取到字符数组,通过getBytes获得字节数组.
开始循环,如果两个数组的下标charArr[i - notCharLen/2]=i(这时notCharLen=0)相同的元素值相等,说明是英文字母,略过.
如果不同,说明在字节数组中这是汉字的前面半个.使得notCharLen++.
下次判断charArr[i - notCharLen/2]就将字节数组中的汉字计算在内了,两个数组的下标比较又在同一起跑线上了.
2 楼 hailongshih 2013-07-01  
lz能否把注释写清楚,有些看不懂
1 楼 thihy 2013-06-30  
CodePoint!!!

相关推荐

    C++中英混合字符串截取

    13年(实习期间)飞娱互动有限公司面试游戏开发客户端/服务器端时的面试题的第一道编程题,当时就差这题没做出来,回去后想出来的。 截取一定长度的字符串,保证不把汉字截断。

    java截取字符串程序,一道面试题。答案

    java截取字符串,一道面试题。好像没有找到正确答案,今天找时间做了一个,仅供参考。本人运行过了。

    java 面试题 经典收藏

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

    java面试题大全(2012版)

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

    java面试题(面试 宝典)

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

    java面试题

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

    MySQL 数据库经典面试题

    3、数据库函数:数值处理函数round(四舍五入函数)、turncate(截取函数)、字符处理函数length(字符串/列名)、concat(列名/字符串)、日期时间处理函数curdate、curtime、sysdate、year 4、什么是视图?如何...

    常规Java工具,算法,加密,数据库,面试题,源代码分析,解决方案

    angularjs 字符串截取过滤器,用于截取字符串 6年前 大数据ETL 提取、转换 6年前 C# 通过系统剪切板把HTML复制到Word中,并且保留原来的格式 6年前 克罗斯 CROS实现跨域时授权问题 6年前 CrossOrigin_请求 服务器端...

    常见面试算法题目

    5. 截取字符串, 如果该字符串是“abc我的”,当截取的字节数是3时候就是"abc',如果是4,依然是 abc,也就是说。不能打印出半个汉字 6. 设计4个线程,其中两个线程每次对j增加1,另外两个线程每次对j减少1 7. 给你...

    java面试题(JAVA代码与编程).pdf

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

    面试题:Java String类常见操作和用法

    本文将介绍Java String类的常见操作和用法,包括字符串的创建、比较、连接、截取、替换等。我们还会讨论字符串与其他数据类型之间的转换、字符串的搜索和分割等常见操作。通过学习本文,您将掌握Java String类的基本...

    PHP的面试题集,附我的答案和分析(一)

    6、如何实现字符串翻转? 7、优化MYSQL数据库的方法。 8、谈谈事务处理 9、apache+mysql+php实现最大负载的方法 10、实现中文字串截取无乱码的方法。 答案: 1.echo date(‘Y-m-d H:i:s’, strtotime(‘-1 day...

    PHP的面试题集

    6、如何实现字符串翻转? 7、优化MYSQL数据库的方法。 8、谈谈事务处理 9、apache+mysql+php实现最大负载的方法 10、实现中文字串截取无乱码的方法。 面试题2 var $empty = ”; var $null = NULL; var $bool...

    华为机试华为OD机试算法题Python源码(41道).zip

    汽水瓶.py,求int型正整数在内存中...字符串反转.py,字符串分割.py,字符串合并处理.py,字符串加密.py,字符串加密2.py,字符串排序.py,字符串运用-密码截取.py,字符串最后一个单词的长度.py,字符个数统计.py,坐标移动.py

    2.6号面试题---编程

    定义一个开关用来和控制是否汉字! 控制两个长度!

    java面试过程当中遇到的一些题目

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

    Java面试宝典-经典

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

    ASP升级.net资料大全(c#入门 语言规范 源码教程 学习笔记 技术资料 面试题 asp与.net代码生成器)

    辅助软件 aspx/asp代码生成器 语言规范 ... 字符串加密.txt 字幕显示屏幕保护.txt 自己动手用c#写控件.txt C#试题 简答题.txt 填空题.txt 问答题1.txt 问答题2.txt 选择题.txt 综合题.txt

    java面试宝典2012

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

Global site tag (gtag.js) - Google Analytics