面试题目:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,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; } }
相关推荐
java截取字符串,一道面试题。好像没有找到正确答案,今天找时间做了一个,仅供参考。本人运行过了。
在IT领域,特别是软件开发和面试准备中,掌握特定公司的技术要求是非常...这个压缩包“华为_华为od题库练习题之截取字符串”就是一个很好的实践资源,通过解题,你可以更好地掌握字符串截取的技巧,并提升编程能力。
本文将以“常见的Java上机面试题”为主题,深度剖析此类面试的核心要点,通过具体的实例,如字符串截取问题,来揭示解决常见Java编程挑战的方法。 #### Java上机面试的结构与目的 上机编程考试通常分为两个主要...
Java面试题中提到的问题是,当截取字符串时,要保证汉字不被分割。这是因为substring方法在处理多字节字符(如汉字)时,可能会在字符中间截断,导致乱码。为了解决这个问题,我们需要编写一个定制的截取函数,这个...
2. 字符串截取算法 在截取字符串函数中,需要使用一个循环来遍历输入字符串,并根据字节数来截取字符串。在这个过程中,需要考虑中文字符和英文字符的占用字节数问题,可以使用正则表达式来匹配中文字符。 3. Java...
标题与描述中的知识点主要聚焦在两个方面:一是PHP中的冒泡排序算法,二是字符串处理,具体涉及了在GBK编码下的字符串截取方法。下面将详细展开这两个知识点。 ### 冒泡排序算法 冒泡排序是一种简单的排序算法。它...
为了在Java面试中脱颖而出,了解和掌握常见的面试题及答案至关重要。以下是一些关键知识点的详细解析: 1. **super()与 this()的区别** `super()`用于调用父类的构造器,确保子类实例化时父类的初始化;`this()`则...
16. **字符串截取**:需要注意对中文字符的处理,避免截断。 17. **打印昨天的当前时刻**:使用`Calendar`或`LocalDateTime`类。 18. **文件读写和计数器实现**:使用`FileReader`、`FileWriter`等类。 19. **...
多字节字符串截取 **题目**: 如何处理多字节字符串的截取? **解析**: - 使用`mb_substr()`函数可以正确处理多字节字符集,如UTF-8。 ```php $str = "你好,世界!"; echo mb_substr($str, 0, 2, 'utf-8'); // ...
以下是一道典型的字符串截取面试题: **面试题1:怎样截取字符串** 该题要求编写一个函数,根据输入的字节数截取字符串,同时保证汉字不被分割。这个问题的关键在于理解Java中字符编码,尤其是中文字符占两个字节...
"oracle数据工程师面试题.pdf" 本资源是一个Oracle数据工程师面试题库,涵盖了多个关于Oracle数据库管理和开发的问题。下面是从文件中提取的知识点: 1. 数据类型和操作 * varchar2数据类型:varchar2是Oracle中...
Java经典面试题 知识点1: 数据统计 在给定的文本文件中,统计出总行数,并找出出现次数最多的那个整数。这个问题考察了数据统计和分析的能力。在解决这个问题时,需要使用Java中的文件输入/输出流、字符串处理和数...
**String 类常用方法**:String 类提供了丰富的操作字符串的方法,包括获取长度(`length()`)、获取特定位置的字符(`charAt(int index)`)、查找子串(`indexOf()`)、截取子串(`substring()`)、比较字符串内容...
在处理包含中文等多字节字符的字符串时,需要确保截取操作不会导致半个汉字被截取,这可能会影响显示效果。 #### 代码解析: 1. **逐字节截取**:使用`substring`函数实现,它接受一个字符串和截取的字节数作为参数...
通常,这样的面试题可能会包含字符串的查找、替换、分割、拼接等操作,或者是对字符串进行特定的算法处理,如正则表达式匹配、字符串排序等。 标签进一步明确了几个关键信息点:“面试”意味着这是一个考核性质的...
10. 字符串截取: 在Java中,substring()和split()方法常用于截取字符串。substring()用于截取子字符串,而split()则是通过正则表达式分割字符串。 11. XML格式和解析技术: XML(可扩展标记语言)的格式包括DTD和...
- `substring()`:截取字符串的一部分。 - `replace()`:替换字符串中所有指定内容。 - `indexOf()`和`lastIndexOf()`:查找指定内容第一次出现和最后一次出现的索引。 - `concat()`:连接两个字符串。 - `...
* 使用substring()方法截取字符串。 2. 面向对象编程 * 对象:运行期的基本实体,封装了数据和操作这些数据的代码的逻辑实体。 * 类:具有相同类型的对象的抽象。 * 封装:将数据和代码捆绑到一起,避免了外界的...
本文还提供了一个字符串截取的示例代码,该代码可以将字符串截取到指定的字节数,同时保证汉字不被截半个。该算法使用了 isLetter 方法来判断字符是否为字母, lengths 方法来计算字符串的字节数,subString 方法来...