黑马程序员技术交流社区
标题:
一道黑马基础测试很多人写不出来的题
[打印本页]
作者:
更上一层
时间:
2014-9-22 13:39
标题:
一道黑马基础测试很多人写不出来的题
package com.itheima;
/*
* 10、编写函数,从一个字符串中按字节数截取一部分,
* 但不能截取出半个中文(GBK码表),
* 例如:从“HM程序员”中截取2个字节是“HM”,
* 截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
*
*
*
* */
public class Test10 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = cutStringByByte("a周tu木h安bcd",6);
System.out.println(str);
}
public static String cutStringByByte(String str,int num){
int sum = 0;
StringBuffer sb = new StringBuffer();
char[] array = str.toCharArray();
for(int i=0;i<array.length;i++){
if(array[i]>=128){
if((num-sum)>=2){
sb.append(array[i]);
sum+=2;
}else{
sum+=2;
}
}else{
sb.append(array[i]);
sum++;
}
if(sum>=num){
break;
}
}
return sb.toString();
}
}
作者:
w936074874
时间:
2014-9-22 14:10
好厉害 ,我怎么没有这道题
作者:
天弓
时间:
2014-9-22 14:51
好厉害,我用递归写法,写的头晕,比这个代码写的多多了,呵呵
作者:
libo1989329
时间:
2014-9-22 16:28
基础很扎实 啊
作者:
JerryJava
时间:
2014-9-22 16:43
中文2个字节,英文字母1个,作为判断条件,添加到StringBuilder中。 很好的思路。
作者:
___瘦不了
时间:
2014-9-22 17:27
楼主屌炸天
作者:
逍遥呆
时间:
2014-9-29 10:38
回头好好看看
作者:
叫我小强
时间:
2014-9-29 11:00
厉害厉害啊!!
作者:
ζ_____________
时间:
2014-9-29 11:53
本帖最后由 ζ_____________ 于 2014-9-29 12:04 编辑
测试了一下,发现有一处错误~
for(int i=0;i<array.length;i++){
if(array>=128){
if((num-sum)>=2){
sb.append(array);
sum+=2;
}else{
sum+=2;
}
}else{
// sb.append(array
); //这里判断出的结果是字母哒,不应该append到sb里去了.
sum++;
}
if(sum>=num){
break;
}
将字符串封装到数组中进行遍历
判断依据是根据字母的ASCII码上限(或者是字母占用的字节数)
再添加到StringBuilder中,方便转回字符串.
结束依据是定义的计量字节数的计数器进行递增,
判断比截取的字节数值大即为函数结束.
好厉害!~ 感谢楼主提供的思路~
作者:
bayshier
时间:
2014-9-29 11:58
楼主好人
作者:
刘宣超
时间:
2014-9-29 14:10
我也有这道题。刚开始的时候一点思路也没有。后来静下来仔细想一想。
慢慢的就写出来了,就感觉没有那么难了,其实很基础的东西。
只是陌生没有见过的题一下就慌了,多做题才是硬道理。
作者:
zuochbd
时间:
2014-9-29 15:37
本帖最后由 caixingke 于 2014-9-29 15:44 编辑
我当时做的也是这一个题, 我向黑马提交的代码就是下面这个:
public class Test10 {
/*
* 从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
* 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,
* 截取3个字节也要是"HM"而不要出现半个中文
*
* 代码思路:
* 我们从第0个字节开始读,
* 如果一个字节在0x00-0x7F之间, 则我们认为是单字节字符, 那么我们count++继续读下一个字节.
* 如果一个字节不在 0x00-0x7F范围内, 则我们认为是双字节字符, count+=2继续读下去.
* 一直到读完这个缓冲区为止.
*/
public static byte[] getBytesFromGBKBuffer(byte[] gbkBuffer, int length) {
try {
if (gbkBuffer == null || length <= 0) { // 输入不合法, 抛出异常
throw new Exception("输入不合法");
} else if (length >= gbkBuffer.length) { // 长度越过这个字串本有的长度, 则直接返回
byte[] buffer = new byte[length];
System.arraycopy(gbkBuffer, 0, buffer, 0, length);
return buffer;
} else {
int count = 0; // 用来指向当前在哪一个字节
while (true) {
// 如果一个字节在0x00-0x7F之间, 我们判断其是单字节字符, 否则其被认为是双字节字符
// 对于补码为0x80-0xFF的, 其是负数, 小于0.
if ((int) gbkBuffer[count] < 0x80
&& (int) gbkBuffer[count] > 0x00) { // 如果是单字节
if (count == length - 1) {
// gbkBuffer[count]已经是我们要取得的最后一个字符了, 所以直接返回.
break;
} else {
// 因为不是最后一个字节, 所以继续
// 因为当前这个字符是一个单字节字符, 所以用count++来取下一个字符的首字节.
count++;
}
} else {
if (count == length - 1) {
// 如果当前字节是最后一个字节, 但因为当前字符是双字节字符,
// 所以为了保持完整性, 不要掉这个字符, count回退.
count--;
break;
} else if (count == length - 2) {
// 如果单前这个字符达到了所要求的长度, 那么就退出.
// 因为当前字符是双字节, 所以count应再往前移动一格.
count++;
break;
} else {
// 因为当前这个字符是双字节字符, 所以这里加2来取下一个字符的首字节.
count += 2;
}
}
}
// 把buffer做为返回值来返回.
int len = count + 1;
byte[] buffer = new byte[len];
System.arraycopy(gbkBuffer, 0, buffer, 0, len);
return buffer;
}
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
// 测试用例
try {
String s = "TM黑马";
// =========================
byte[] a = getBytesFromGBKBuffer(s.getBytes("GBK"), 3);
System.out.println(new String(a, "GBK")); // 打印: TM
// =========================
byte[] b = getBytesFromGBKBuffer(s.getBytes("GBK"), 4);
System.out.println(new String(b, "GBK")); // 打印: TM黑
// =========================
byte[] c = getBytesFromGBKBuffer(s.getBytes("GBK"), 5);
System.out.println(new String(c, "GBK")); // 打印: TM黑
// ==========================
byte[] d = getBytesFromGBKBuffer(s.getBytes("GBK"), 6);
System.out.println(new String(d, "GBK")); // 打印: TM黑马
// =========================
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
复制代码
作者:
小城。
时间:
2014-9-29 17:48
:(我不会,,,
作者:
在学野马
时间:
2014-9-29 18:15
谢谢楼主分享
作者:
Eagle
时间:
2014-9-29 18:26
都是大神啊。目测好多。
作者:
犹豫铅笔
时间:
2014-9-29 19:07
谢谢楼主分享,看懂了,
作者:
sublimter
时间:
2014-9-30 09:51
受教了~~~
作者:
海燕
时间:
2014-9-30 10:06
谢谢楼主分享哦
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2