A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小丑的媳妇2 中级黑马   /  2013-3-8 11:55  /  1098 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

我大概前后编译运行了7次 找到了一种完整的实现方式
代码如下:

package test;

class SplitString
{
String SplitStr;
int SplitByte;
public SplitString(String str,int bytes)
{
SplitStr=str;
SplitByte=bytes;
System.out.println(“The String is:’”+SplitStr+”‘;SplitBytes=”+SplitByte);
}
public void SplitIt()
{
int loopCount;

loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte)SplitStr.length()/Split

Byte+1);
System.out.println(“Will Split into “+loopCount);
for (int i=1;i<=loopCount ;i++ )
{
if (i==loopCount){

System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length()));
} else {

System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte)));
}
}
}
public static void main(String[] args)
{
SplitString ss = new SplitString(“test中dd文dsaf朱荣宁3443n荣宁43朱荣宁
0ewldfls=103″,4);
ss.SplitIt();
}
}

细心的高手会发现,这种实现方式的定义没有什么技术含量,而且时间复杂度很高,
希望路过的高手能给出空间复杂度和时间复杂度都很合适的算法,多谢!等待中.......

2 个回复

正序浏览
  1. class Test2
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String s2=getStr("我ABC你CDF他DEF",8);
  6.                 System.out.println("s2="+s2);
  7.         }
  8.         public static String getStr(String str,int n)//我计算的是包含n,也就是0-n这个随意了...
  9.         {
  10.                 String s="";
  11.                 int count=0;
  12.                 if(n<=str.length())
  13.                         s=str.substring(0,n);
  14.                 char[] arr=s.toCharArray();
  15.                 for(char c:arr)
  16.                 {        if(c<=32||c>=127)//判断这个字符在不在ASCII码表中,如果有不在的.就说明是汉字
  17.                                 count++;
  18.                 }
  19.                 s=s.substring(0,n-count);
  20.                 return s;
  21.         }
  22. }
复制代码
回复 使用道具 举报
public static void main(String[] args)throws Exception {
                //定义一个字符串并初始化
                String str = "abc中国13";
                //获取需要截取的长度
                int num = subStr(str.getBytes("GBK"), 7);
                //开始截取字符串
                String resultStr=str.substring(0, num);
                System.out.println(resultStr);
        }

        /**
         * 计算需要截取字符串的长度(主要判断对中文的处理)
         * @param buf
         * @param n
         * @return
         */
        public static int subStr(byte[] buf, int length) {
                int num = 0;
                boolean bChineseFirstHalf = false;
                for (int i = 0; i < length; i++) {
                        if (buf[i] < 0 && !bChineseFirstHalf) {
                                bChineseFirstHalf = true;
                        } else {
                                num++;
                                bChineseFirstHalf = false;
                        }
                }
                return num;
        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马