论坛首页 Java企业应用论坛

面试题:编写一个截取字符串的函数

浏览 20297 次
精华帖 (0) :: 良好帖 (4) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-11  
nianien 写道
//根本和编码没有关系
//考虑的是字符串而不是字符
public class Test {
    public static String subString(String str, int bytes) {
        StringBuilder sb = new StringBuilder();
        int sum = 0;
        for (int i = 0; i < str.length(); i++) {
            String ch = str.substring(i, i + 1);
            if ((sum += ch.getBytes().length) > bytes) break;
            sb.append(ch);
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String str = "我ABC";
        System.out.println(subString(str,4));
        str = "我ABC汉DEF";
         System.out.println(subString(str,6));
    }

}



正解
0 请登录后投票
   发表时间:2011-05-11   最后修改:2011-05-11
nianien 写道
//根本和编码没有关系
//考虑的是字符串而不是字符
public class Test {
    public static String subString(String str, int bytes) {
        StringBuilder sb = new StringBuilder();
        int sum = 0;
        for (int i = 0; i < str.length(); i++) {
            String ch = str.substring(i, i + 1);
            if ((sum += ch.getBytes().length) > bytes) break;
            sb.append(ch);
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String str = "我ABC";
        System.out.println(subString(str,4));
        str = "我ABC汉DEF";
         System.out.println(subString(str,6));
    }

}

你再好好看看题目,如“我ABC” 4,应该截为“我AB”,输入“我ABC汉DEF” 6,应该输出为“我ABC”而不是“我ABC+汉的半个”。再问一下您,ch.getBytes()中默认的编码是什么,您知道吗? 看你程序的输出:


  • 大小: 34.4 KB
0 请登录后投票
   发表时间:2011-05-11  
duronshi 写道
nianien 写道
//根本和编码没有关系
//考虑的是字符串而不是字符
public class Test {
    public static String subString(String str, int bytes) {
        StringBuilder sb = new StringBuilder();
        int sum = 0;
        for (int i = 0; i < str.length(); i++) {
            String ch = str.substring(i, i + 1);
            if ((sum += ch.getBytes().length) > bytes) break;
            sb.append(ch);
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String str = "我ABC";
        System.out.println(subString(str,4));
        str = "我ABC汉DEF";
         System.out.println(subString(str,6));
    }

}



正解

兄弟,你好好运行一下上面的代码,看是否能得出题目要求的结果。
0 请登录后投票
   发表时间:2011-05-11   最后修改:2011-05-11
没看大家的解决方案,自己尝试写了下。思路还真不一样。看了下楼主的解决办法,发现自己对JDK的API还需仔细研磨下,贴出菜鸟级的方法大家轻拍
public static void mySubString(String context,int byteIndex){
char [] context_chars = context.toCharArray();
List<Integer> chineseBeginIndex = new ArrayList<Integer>();
//将中文的byteBeginIndex放入集合
int j=0;
for(char c : context_chars){
if(String.valueOf(c).matches("[^u4E00-u9FA5]")){
chineseBeginIndex.add(j+1);
j+=2;
}else{
j++;
}
}
byte [] context_bytes = context.getBytes();
int byteLength = context_bytes.length;
byteIndex = byteIndex>byteLength?byteLength:byteIndex;
for(Integer v : chineseBeginIndex ){
if(v==byteIndex)byteIndex++;
}
byte [] resultBytes = new byte[byteIndex];
for(int i=0;i<byteIndex;i++){
resultBytes[i]=context_bytes[i];
}
System.out.println(new String(resultBytes));
}
public static void main(String[] args) {
mySubString("ABC12我是123AS啊", 6);
}
0 请登录后投票
   发表时间:2011-05-11  
shaomeng95 写道
duronshi 写道
nianien 写道
//根本和编码没有关系
//考虑的是字符串而不是字符
public class Test {
    public static String subString(String str, int bytes) {
        StringBuilder sb = new StringBuilder();
        int sum = 0;
        for (int i = 0; i < str.length(); i++) {
            String ch = str.substring(i, i + 1);
            if ((sum += ch.getBytes().length) > bytes) break;
            sb.append(ch);
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String str = "我ABC";
        System.out.println(subString(str,4));
        str = "我ABC汉DEF";
         System.out.println(subString(str,6));
    }

}



正解

兄弟,你好好运行一下上面的代码,看是否能得出题目要求的结果。


兄台,我还是坚持认为,这道题考得和编码根本没有任何关系,
你无非需要一种汉字用两个字节,英文用一个字节的编码而已,仅此而已
而你编写的Java程序,ch.getBytes()默认的是当前平台默认编码格式
而在中文环境下就是GBK,而且你可以随便指定编码ch.getBytes("GBK"),这OK
所以核心代码还是下面这个,就三句话而已
public static String subString(String str, int bytes) throws Exception {
int i = 1;
for (; i <= str.length()&& str.substring(0, i).getBytes("GBK").length <= bytes; i++);
return str.substring(0, i - 1);
}
0 请登录后投票
   发表时间:2011-05-11  
shaomeng95 写道
nianien 写道
//根本和编码没有关系
//考虑的是字符串而不是字符
public class Test {
    public static String subString(String str, int bytes) {
        StringBuilder sb = new StringBuilder();
        int sum = 0;
        for (int i = 0; i < str.length(); i++) {
            String ch = str.substring(i, i + 1);
            if ((sum += ch.getBytes().length) > bytes) break;
            sb.append(ch);
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String str = "我ABC";
        System.out.println(subString(str,4));
        str = "我ABC汉DEF";
         System.out.println(subString(str,6));
    }

}

你再好好看看题目,如“我ABC” 4,应该截为“我AB”,输入“我ABC汉DEF” 6,应该输出为“我ABC”而不是“我ABC+汉的半个”。再问一下您,ch.getBytes()中默认的编码是什么,您知道吗? 看你程序的输出:



有那么麻烦么?
public static String subString(String str, int bytes) throws Exception {  
int i = 1;  
for (; i <= str.length()&& str.substring(0, i).getBytes("GBK").length <= bytes; i++);  
return str.substring(0, i - 1);  
}
0 请登录后投票
   发表时间:2011-05-11  
我也实现了下,不需要用getBytes()这样的方法。
地址:http://zhaiyz.iteye.com/blog/1040743
0 请登录后投票
   发表时间:2011-05-11  
其实, 题目很简单。
想说的是, 楼主的解题思路很清晰, 条件考虑的很仔细, 对编码的考虑确实合理。
也写过这个面试题, 当初没考虑编码, 后来才发现编码不同的环境下, 字符的字节不同。也懒得去改了。

http://myter7.iteye.com/blog/1011715
0 请登录后投票
   发表时间:2011-05-12  
wolf_awp 写道
我也实现了下,不需要用getBytes()这样的方法。
地址:http://zhaiyz.iteye.com/blog/1040743

其实题目的核心就是让汉字占两个字节
StringBuilder或StringBuffer是不用的
我们只需确定截取字符串的下标就可以了!
不同编码情况应该有不同的判断方法
你这里虽然没有用到getBytes()方法,但还是用了unicode。

再次声明,本题和编码是没有关系的
你只需要一种汉字占成两个字节,英文占一个字节的编码,不论这个编码是哪种格式
0 请登录后投票
   发表时间:2011-05-12  
nianien 写道
wolf_awp 写道
我也实现了下,不需要用getBytes()这样的方法。
地址:http://zhaiyz.iteye.com/blog/1040743

其实题目的核心就是让汉字占两个字节
StringBuilder或StringBuffer是不用的
我们只需确定截取字符串的下标就可以了!
不同编码情况应该有不同的判断方法
你这里虽然没有用到getBytes()方法,但还是用了unicode。

再次声明,本题和编码是没有关系的
你只需要一种汉字占成两个字节,英文占一个字节的编码,不论这个编码是哪种格式

UTF-8中汉字是3字节吧
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics