今天在搜索判断字符是否是中文的时候看到一道面试题目:
题目 写道
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我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
分享到:
相关推荐
这个类提供了丰富的API,如`substring()`用于截取字符串,`indexOf()`和`lastIndexOf()`用于查找子串,`replace()`和`replaceAll()`用于替换子串,`split()`用于按指定分隔符分割字符串,以及`concat()`用于连接字符...
数字构造问题是算法设计与分析领域中的一道经典题目。该问题要求使用给定的数字字符串,构建一个能够整除15的最大整数,注意每个字符只能使用一次。下面是对该问题的详细解析和解决方案。 问题描述: 给定一个只...
endIndex)`截取字符串的一部分。在解决这道题目时,这些方法可能会派上用场。 二、动态规划 动态规划是一种用于解决复杂问题的有效算法,它通过将问题分解成更小的子问题来求解。在这道题中,我们可能需要找到一个...
在JavaScript中,字符串处理是常用的一种编程操作,涵盖了字符串的创建、截取、拼接、大小写转换等多种操作。文件中提到的网址字符串分解问题,需要对字符串进行分割和键值对的提取,是字符串处理的一种应用。 2. ...
这是一道简单的字符串操作题目,主要考察字符串的截取和字符计数能力。解决这类问题的关键是对字符串的基本操作有熟练掌握,包括如何遍历字符串、如何获取特定位置的字符等。 #### #1716 Range Sum in 2D Array ...
该题要求编写一个函数,根据输入的字节数截取字符串,同时保证汉字不被分割。这个问题的关键在于理解Java中字符编码,尤其是中文字符占两个字节,而英文字符占一个字节。解决这个问题需要编写一个算法,能够识别和...
这是一道关于字符串数组排序的问题,要求对包含10个字符串的数组按照字典序进行排序。解决方案采用了经典的冒泡排序算法,其中`paixu`函数是排序的核心,通过两层嵌套的`for`循环比较并交换数组中的元素,利用`...
接着,我们需要编写一个函数来截取字符串。这个函数的关键在于确保不会将汉字截断。在UTF-8编码下,一个汉字通常占用3个或4个字节,而英文字母或数字则占用1个字节。因此,我们在截取时需要考虑字符串的字节长度,而...
**面试题1:怎样截取字符串** **题目描述**:设计一个函数,接受一个字符串和一个整数作为参数,返回一个按照指定字节数截取的字符串,但需确保不会截断汉字(每个汉字占两个字节)。例如,对于输入"我ABC"和数字4...
这是一道经典的字符串操作题,旨在考察如何在有限的时间和空间内完成字符串逆序的操作。通常情况下,最直观的方法是通过开辟一个新的数组来存放逆序后的字符串,但这种方法的空间复杂度较高(O(n))。题目要求时间...
- **字符串操作**:包括字符串的拼接、截取以及字符的转换,是数据处理中不可或缺的技能,如使用`charAt()`和`substring()`等方法。 - **条件判断与控制流**:通过`if`语句进行条件判断,结合循环控制程序的流程,...
该Java编程题目旨在考察考生对于字符串操作、数组使用以及基本控制流程的理解。通过定义必要的常量和数组,再结合条件判断和循环结构,可以有效地实现阿拉伯数字到中文大写数字的转换。需要注意的是,部分代码片段...
【华为实习练习题】涉及到多个编程题目,涵盖了字符串处理、递减数计算和社交网络信息传播的优化问题。 首先,让我们详细分析第一个题目——“密码截取”。这是一道关于字符串处理的问题,主要目标是从可能含有无关...
1. **字符串操作**:题目要求删除字符串中指定位置的字符,这涉及到字符串的截取和重组,以及字符数组的下标访问。 2. **字符数组的结束标志**:使用`'\\0'`作为字符串的结束标志,确保正确地构建和处理字符串。 ##...
3. 第824题:山羊拉丁文:这是一道关于字符串处理的题目。山羊拉丁文是一种变形的英语,遵循特定的规则。首先,单词根据字母表顺序分成五组(A, AEIOU, B-H, I-M, N-Z),然后每组内的单词按照原顺序保持不变。其次...
这个过程通过查找"XXXX"并使用`str_find`函数定位,然后用`str_substr`函数截取字符串。这种方法可以用于隐藏实际密码的一部分,增加破解难度。 在解决这类安全问题时,我们常常需要对代码进行逆向工程,理解其内部...
6. **第六题**:字符串截取。涉及字符串操作和数组。 - 字符串复制:将原字符串中指定位置之外的字符复制到新字符串。 - 结尾添加字符串结束符:`b[j]='\0'`确保字符串的完整性。 7. **第七题**:找出数组中的...
7. 在VB6.0中,使用LEFT函数截取字符串,所以正确的表达式是LEFT("Visual Basic 6.0",6)。 8. String(2,"abcdef")会返回两个连续的首字符,即"aa"。 9. 光盘不是多媒体信息,它是存储媒介,而多媒体信息是指文本、...
5. 字符串处理:学习字符串的拼接、截取、查找、替换等方法。 6. 逻辑运算:理解与、或、非等逻辑运算符,用于条件判断。 7. 列表排序和查找:掌握冒泡排序、选择排序、插入排序等简单排序算法,以及线性查找、二分...
32. **取整数位数**:字符串操作截取指定位数。 33. **杨辉三角形**:双重循环生成帕斯卡三角。 34. **三数排序**:比较并交换元素位置。 35. **数组交换**:调整数组首尾元素。 36. **数组循环移位**:使用数组复制...