`
sushe1424
  • 浏览: 4788 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
最近访客 更多访客>>
社区版块
存档分类
最新评论

一道截取字符串的题目

    博客分类:
  • J2SE
阅读更多

今天在搜索判断字符是否是中文的时候看到一道面试题目:

 

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

 我写了一个较共用的,可以截取一个字符串中的任意一段,支持编码:

public static boolean isChinseseChar(char ch) {
		Pattern p = Pattern.compile("[\\u4e00-\\u9fa5]");
		return p.matcher(ch+"").find();
	}
	
	/**
	 * 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 
	 * 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
	 * @param source 源字符串
	 * @param startPos 开始字节数
	 * @param endPos 结束字节数
	 * @param charset 编码类型
	 * @return 截取的字符串
	 * @throws UnsupportedEncodingException
	 */
	public static String cutString(String source,int startPos, int endPos, String charset) throws UnsupportedEncodingException{
		byte[] bs = source.getBytes(charset);
		if(startPos > bs.length)
			throw new RuntimeException("startPos大于字符" + source + "的总共字节数!");
		if(endPos > bs.length)
			endPos = bs.length;
		int offset = 0;
		int factor = "编".getBytes(charset).length;
		int start = -1, end = -1;
		for(int i=0; i<source.length(); i++) {
			if(offset == startPos)//offset = startPos,其实位置的字节数正好是一个非中文字开头
				start = i;
			if(offset > startPos && start == -1)//offset已经大于startPos但是还没找到offset=startPos的位置,说明开始的是一个中文字符
				start = i;
			if(isChinseseChar(source.charAt(i)))
				offset += factor;
			else 
				offset ++;
			if(offset == endPos){
				end = i+1;
			}
			if(offset > endPos && end == -1) {
				end = i;
			}
			if(start != -1 && end != -1)
				break;
		}
		if(start >= end)
			return "";
		return source.substring(start,end);
	}
	
	public static String cutString(String source,int startPos,int endPos) throws UnsupportedEncodingException{
		return cutString(source,startPos,endPos,Charset.defaultCharset().toString());
	}
	
	public static String cutString(String source,int endPos) throws UnsupportedEncodingException{
		return cutString(source,0,endPos,Charset.defaultCharset().toString());
	}
	
	public static String cutString(String source,int endPos, String charset) throws UnsupportedEncodingException{
		return cutString(source,0,endPos,charset);
	}

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		String source = "我是abc";
		System.out.println(source+"[0,4](gbk): "+cutString(source,0,4,"gbk"));
		System.out.println(source+"[0,4](utf-8): "+cutString(source,0,4,"utf-8"));
		source = "adf12我是abc";
		System.out.println(source+"[0,2](gbk): "+cutString(source,0,2,"gbk"));
		System.out.println(source+"[0,2](utf-8): "+cutString(source,0,2,"utf-8"));
		source = "add她fdf2我是abc";
		System.out.println(source+"[0,11](gbk): "+cutString(source,0,11,"gbk"));
		System.out.println(source+"[0,11](utf-8): "+cutString(source,0,11,"utf-8"));
		System.out.println(source+"[10,11](gbk): "+cutString(source,10,11,"gbk"));
		System.out.println(source+"[10,11](utf-8): "+cutString(source,10,11,"utf-8"));
		System.out.println(source+"[8,12](gbk): "+cutString(source,8,12,"gbk"));
		System.out.println(source+"[8,12](utf-8): "+cutString(source,8,12,"utf-8"));
		System.out.println(source+"[9,11](gbk): "+cutString(source,9,11,"gbk"));
		System.out.println(source+"[9,11](utf-8): "+cutString(source,9,11,"utf-8"));
		System.out.println(source+"[0,20](gbk): "+cutString(source,0,20,"gbk"));
		System.out.println(source+"[0,20](utf-8): "+cutString(source,0,20,"utf-8"));
	}

 打印结果:

 写道
我是abc[0,4](gbk): 我是
我是abc[0,4](utf-8): 我
adf12我是abc[0,2](gbk): ad
adf12我是abc[0,2](utf-8): ad
add她fdf2我是abc[0,11](gbk): add她fdf2我
add她fdf2我是abc[0,11](utf-8): add她fdf2
add她fdf2我是abc[10,11](gbk):
add她fdf2我是abc[10,11](utf-8):
add她fdf2我是abc[8,12](gbk): 2我
add她fdf2我是abc[8,12](utf-8): f2
add她fdf2我是abc[9,11](gbk): 我
add她fdf2我是abc[9,11](utf-8): 2
add她fdf2我是abc[0,20](gbk): add她fdf2我是abc
add她fdf2我是abc[0,20](utf-8): add她fdf2我是abc
分享到:
评论

相关推荐

    面试UC浏览器的一道处理字符串的题目(已提供答案)

    这个类提供了丰富的API,如`substring()`用于截取字符串,`indexOf()`和`lastIndexOf()`用于查找子串,`replace()`和`replaceAll()`用于替换子串,`split()`用于按指定分隔符分割字符串,以及`concat()`用于连接字符...

    给定一个只包含数字[0…9]的字符串,请使用字符中的某些字符,构建一个能够整除15的最大整数,注意字符中的每个字符只能使用一次

    数字构造问题是算法设计与分析领域中的一道经典题目。该问题要求使用给定的数字字符串,构建一个能够整除15的最大整数,注意每个字符只能使用一次。下面是对该问题的详细解析和解决方案。 问题描述: 给定一个只...

    js-leetcode题解之字符串字符最短路径-题解.zip

    endIndex)`截取字符串的一部分。在解决这道题目时,这些方法可能会派上用场。 二、动态规划 动态规划是一种用于解决复杂问题的有效算法,它通过将问题分解成更小的子问题来求解。在这道题中,我们可能需要找到一个...

    JavaScript 一道字符串分解的题目

    在JavaScript中,字符串处理是常用的一种编程操作,涵盖了字符串的创建、截取、拼接、大小写转换等多种操作。文件中提到的网址字符串分解问题,需要对字符串进行分割和键值对的提取,是字符串处理的一种应用。 2. ...

    zoj题目简单归类zoj题目简单归类

    这是一道简单的字符串操作题目,主要考察字符串的截取和字符计数能力。解决这类问题的关键是对字符串的基本操作有熟练掌握,包括如何遍历字符串、如何获取特定位置的字符等。 #### #1716 Range Sum in 2D Array ...

    讲座资料(2021年-2022年收藏的常见的Java上机面试题.doc

    该题要求编写一个函数,根据输入的字节数截取字符串,同时保证汉字不被分割。这个问题的关键在于理解Java中字符编码,尤其是中文字符占两个字节,而英文字符占一个字节。解决这个问题需要编写一个算法,能够识别和...

    西工大c语言实验100题06

    这是一道关于字符串数组排序的问题,要求对包含10个字符串的数组按照字典序进行排序。解决方案采用了经典的冒泡排序算法,其中`paixu`函数是排序的核心,通过两层嵌套的`for`循环比较并交换数组中的元素,利用`...

    2.6号面试题---编程

    接着,我们需要编写一个函数来截取字符串。这个函数的关键在于确保不会将汉字截断。在UTF-8编码下,一个汉字通常占用3个或4个字节,而英文字母或数字则占用1个字节。因此,我们在截取时需要考虑字符串的字节长度,而...

    常见的Java上机面试题

    **面试题1:怎样截取字符串** **题目描述**:设计一个函数,接受一个字符串和一个整数作为参数,返回一个按照指定字节数截取的字符串,但需确保不会截断汉字(每个汉字占两个字节)。例如,对于输入"我ABC"和数字4...

    常考的算法题,C&C++

    这是一道经典的字符串操作题,旨在考察如何在有限的时间和空间内完成字符串逆序的操作。通常情况下,最直观的方法是通过开辟一个新的数组来存放逆序后的字符串,但这种方法的空间复杂度较高(O(n))。题目要求时间...

    国信蓝桥杯四川赛区2012年java组最后一道大题详解

    - **字符串操作**:包括字符串的拼接、截取以及字符的转换,是数据处理中不可或缺的技能,如使用`charAt()`和`substring()`等方法。 - **条件判断与控制流**:通过`if`语句进行条件判断,结合循环控制程序的流程,...

    一道java题

    该Java编程题目旨在考察考生对于字符串操作、数组使用以及基本控制流程的理解。通过定义必要的常量和数组,再结合条件判断和循环结构,可以有效地实现阿拉伯数字到中文大写数字的转换。需要注意的是,部分代码片段...

    2015华为实习练习题

    【华为实习练习题】涉及到多个编程题目,涵盖了字符串处理、递减数计算和社交网络信息传播的优化问题。 首先,让我们详细分析第一个题目——“密码截取”。这是一道关于字符串处理的问题,主要目标是从可能含有无关...

    c语言上机题库

    1. **字符串操作**:题目要求删除字符串中指定位置的字符,这涉及到字符串的截取和重组,以及字符数组的下标访问。 2. **字符数组的结束标志**:使用`'\\0'`作为字符串的结束标志,确保正确地构建和处理字符串。 ##...

    java-leetcode题解之第824题山羊拉丁文.zip

    3. 第824题:山羊拉丁文:这是一道关于字符串处理的题目。山羊拉丁文是一种变形的英语,遵循特定的规则。首先,单词根据字母表顺序分成五组(A, AEIOU, B-H, I-M, N-Z),然后每组内的单词按照原顺序保持不变。其次...

    第十题解题思路——开启时间之轮1

    这个过程通过查找"XXXX"并使用`str_find`函数定位,然后用`str_substr`函数截取字符串。这种方法可以用于隐藏实际密码的一部分,增加破解难度。 在解决这类安全问题时,我们常常需要对代码进行逆向工程,理解其内部...

    南开c编程100题答案

    6. **第六题**:字符串截取。涉及字符串操作和数组。 - 字符串复制:将原字符串中指定位置之外的字符复制到新字符串。 - 结尾添加字符串结束符:`b[j]='\0'`确保字符串的完整性。 7. **第七题**:找出数组中的...

    2021-2022计算机二级等级考试试题及答案No.14024.docx

    7. 在VB6.0中,使用LEFT函数截取字符串,所以正确的表达式是LEFT("Visual Basic 6.0",6)。 8. String(2,"abcdef")会返回两个连续的首字符,即"aa"。 9. 光盘不是多媒体信息,它是存储媒介,而多媒体信息是指文本、...

    [CSP-J模拟赛1022]label.zip

    5. 字符串处理:学习字符串的拼接、截取、查找、替换等方法。 6. 逻辑运算:理解与、或、非等逻辑运算符,用于条件判断。 7. 列表排序和查找:掌握冒泡排序、选择排序、插入排序等简单排序算法,以及线性查找、二分...

    java编程题

    32. **取整数位数**:字符串操作截取指定位数。 33. **杨辉三角形**:双重循环生成帕斯卡三角。 34. **三数排序**:比较并交换元素位置。 35. **数组交换**:调整数组首尾元素。 36. **数组循环移位**:使用数组复制...

Global site tag (gtag.js) - Google Analytics