---------------------------------
周五下午做的面试题,回来一直在想!大家帮我看看,顺便带上方法注释!
197 个解决方案
#1
用 byte数组 方式 截取的时候判断 截的位置 是否在
GBK编码格式的 中文区域内 这样?
好象有点笨 效率有问题
我去写写看!!!
GBK编码格式的 中文区域内 这样?
好象有点笨 效率有问题
我去写写看!!!
#2
你要截取的是"字节",那应该会出乱码吧
#3
转换
#4
截半个汉字会有乱码 这种情况下舍掉半个汉字
#5
不错的帖子,想想
#6
比较困难。
#7
mark下
#8
我也遇到过同样的面试题,真是麻烦,只想到了stringStream的方法,按字符数截取,按字节的自己搞不懂,关注
#9
判断最后取的2个字节是否属于一个汉字?先标记帖子
#10
想想
#11
等待答案,学习学习
#12
我在别的地方找了一段代码
public static String substring(String str, int toCount,String more)
{
int reInt = 0;
String reStr = "";
if (str == null)
return "";
char[] tempChar = str.toCharArray();
for (int kk = 0; (kk < tempChar.length && toCount > reInt); kk++)
{
String s1 = str.valueOf(tempChar[kk]);
System.out.print(s1);
byte[] b = s1.getBytes();
reInt += b.length;
reStr += tempChar[kk];
}
if (toCount == reInt || (toCount == reInt - 1))
reStr += more;
return reStr;
}
public static String substring(String str, int toCount,String more)
{
int reInt = 0;
String reStr = "";
if (str == null)
return "";
char[] tempChar = str.toCharArray();
for (int kk = 0; (kk < tempChar.length && toCount > reInt); kk++)
{
String s1 = str.valueOf(tempChar[kk]);
System.out.print(s1);
byte[] b = s1.getBytes();
reInt += b.length;
reStr += tempChar[kk];
}
if (toCount == reInt || (toCount == reInt - 1))
reStr += more;
return reStr;
}
#13
貌似有点麻烦!
#14
真不好意思 ,我是初学的,水平有限
#15
有点意思
#16
网上能搜到
#17
一个一个截 截好判断是否是数字或E文
如果是就 append 如果不是就截2个
我是这么个思路!
如果是就 append 如果不是就截2个
我是这么个思路!
#18
百度 N 多回答的。
#19
public static string SubstringByByte(string str, int byteLength)
{
char[] strs = str.ToCharArray();
string strings = null;
if (byteLength == 0)
return strings;
foreach (char temp in strs)
{
byte[] bytes = Encoding.UTF8.GetBytes(temp.ToString());
strings += temp.ToString();
byteLength = byteLength - bytes.Length;
if (byteLength <= 0)
break;
}
return strings;
}
虽然有点麻烦,不过好像能行
{
char[] strs = str.ToCharArray();
string strings = null;
if (byteLength == 0)
return strings;
foreach (char temp in strs)
{
byte[] bytes = Encoding.UTF8.GetBytes(temp.ToString());
strings += temp.ToString();
byteLength = byteLength - bytes.Length;
if (byteLength <= 0)
break;
}
return strings;
}
虽然有点麻烦,不过好像能行
#20
谁有更好的方案学习学习
#21
載字節時應該出現亂碼!!
mark
mark
#22
//用C#实现一个:
static string GetSubString(string str, int byteCount)
{
int count = 0;
string result = string.Empty;
foreach (char ch in str)
{
count += System.Text.Encoding.Default.GetByteCount(ch.ToString());
if (count > byteCount) break;
result += ch.ToString();
}
return result;
}
static void Main(string[] args)//调用
{
string str = "我ABC汉DEF";
for (int i = 1; i < 10; i++)
{
Console.WriteLine("截出"+i+"个字节:");
Console.WriteLine(GetSubString(str, i));
}
}
/*输出结果:
截出1个字节:
截出2个字节:
我
截出3个字节:
我A
截出4个字节:
我AB
截出5个字节:
我ABC
截出6个字节:
我ABC
截出7个字节:
我ABC汉
截出8个字节:
我ABC汉D
截出9个字节:
我ABC汉DE
*/
#23
asdfsadfasdfasdf
#24
不太明白 你说的。。。
#25
顶!
#26
#27
public class Test {
/**
* @param args
*/
public void output(int count,String str)
{
int index=0;
boolean flag=false;
for(int i=0;i<str.length()&& index<count;i++)
{
char c=str.charAt(i);
if(c>=0 && c<=255)
{
flag=true;
index++;
System.out.println(c);
}
if(flag==false)
{
index+=2;
if(index<=count)System.out.println(c);
}
flag=false;
}
}
public static void main(String[] args) {
Test t=new Test();
t.output(6,"ab@毕AKDJSD");
}
}
#28
JDK1.5以上直接substring就可以了,不会半个汉字的。
#29
要好好学习。我是刚学习的。向你们学习.
#30
mark
#31
mark
#32
sdsdfsdfsdf
#33
- - !!!!!!!!!!!!
#34
学习!
#35
学习中!
#36
public String getResult(String input,int num)
{
int max=getBytes(input).length;
//判断特殊情况
if(num<=0||num>=max)return input;
//重原始字符串得到字符数组
char [] cs = input.toCharArray();
//要得到固定字节的数组
char [] rs = new char[num];
for(int i=0;i<num;i++)
{
//判断字符是否汉字,是最后一次循环并且是汉字,直接退出循环;如果是汉字又不是最后一次循环,字节数num减一,相当与少循环一次,少个字符
if(cs[i].toString().getBytes().length!= cs[i].toString().length &&(i==num-1))
break;
else if(cs[i].toString().getBytes().length!= cs[i].toString().length &&(i<num-1))
num--;
rs[i]=cs[i];
}
return new String(rs);
}
{
int max=getBytes(input).length;
//判断特殊情况
if(num<=0||num>=max)return input;
//重原始字符串得到字符数组
char [] cs = input.toCharArray();
//要得到固定字节的数组
char [] rs = new char[num];
for(int i=0;i<num;i++)
{
//判断字符是否汉字,是最后一次循环并且是汉字,直接退出循环;如果是汉字又不是最后一次循环,字节数num减一,相当与少循环一次,少个字符
if(cs[i].toString().getBytes().length!= cs[i].toString().length &&(i==num-1))
break;
else if(cs[i].toString().getBytes().length!= cs[i].toString().length &&(i<num-1))
num--;
rs[i]=cs[i];
}
return new String(rs);
}
#37
解释的不是很清楚,我自己写的,验证通过,没问题
/**
* 逐一的验证子串,得到获得临界的那个的位置 index
*
* @param s
* @param b
* @return
*/
public static String sss(String s, int b) {
int byteNum = b;// 记录要的字节数
String sub = "";// 保存子串
int index = 1;// 用于记录字符串的长度,比如: 我AB 长度是3,而不是字节数4
for (int i = 1; i <= s.toCharArray().length
&& byteNum - sub.getBytes().length > 0; i++) {
sub = s.substring(0, i);
index = i - 1;
}
if (byteNum - sub.getBytes().length == 0) {// 如果正好满足临界条件,就直接返回sub
return sub;
} else {
return s.substring(0, index);// 如果不满足,就减少一个字符(i-1),确保比限定的字节小
}
}
#38
截取字节和字符似乎没有什么难度,唯一的难度其实就是判断接触去的是个什么东西了。。
给出我的方式吧,自己感觉是最方便的
写个方法,方法中代码如下,功能就是判断是字符还是非字符,然后调用这个判断下就可以了
if (sChar.CompareTo("a") >= 0 && sChar.CompareTo("z") <= 0)
bReturn = true;
if (sChar.CompareTo("A") >= 0 && sChar.CompareTo("Z") <= 0)
bReturn = true;
else
bReturn = false;
给出我的方式吧,自己感觉是最方便的
写个方法,方法中代码如下,功能就是判断是字符还是非字符,然后调用这个判断下就可以了
if (sChar.CompareTo("a") >= 0 && sChar.CompareTo("z") <= 0)
bReturn = true;
if (sChar.CompareTo("A") >= 0 && sChar.CompareTo("Z") <= 0)
bReturn = true;
else
bReturn = false;
#39
学习了。
#40
这个不错!
MARKED BY CNDO
#41
我没明白你的意思
#42
回帖是一种美德!每天回帖即可获得 10 分可用分!
#43
有点意思,我也做做看
#44
class CopyStrByByte{
private String str = ""; //字符串
private int copyNum = 0; //要复制的字节数
private String arrStr[]; //存放将字符串拆分成的字符数组
private int cutNum = 0; //已截取的字节数
private int cc = 0; //str中的中文字符数
public CopyStrByByte(String str,int copyNum){
this.str = str;
this.copyNum = copyNum;
}
public String CopyStr(){
arrStr = str.split(""); //将传的字符串拆分为字符数组
str = ""; // 清空,用于存放已截取的字符
for (int i = 0;i < arrStr.length;i++){
if (arrStr[i].getBytes().length == 1){ // 非汉字
cutNum = cutNum + 1;
str = str + arrStr[i];
} else if (arrStr[i].getBytes().length == 2) { //汉字
cc = cc + 1;
cutNum = cutNum + 2;
str = str + arrStr[i];
}
if (cutNum >= copyNum) break; //已截取的字符数大于或等于要截取的字符数
}
if (cutNum > copyNum){ //已截取的字符数大于要截取的字符数
return str.substring(0, copyNum - cc);
} else {
return str;
}
}
}
public class TestCopyStr{
public static void main(String args[]){
CopyStrByByte cp = new CopyStrByByte("as论者afs为什么",12);
System.out.println(cp.CopyStr());
}
}
#45
回帖是一种美德!每天回帖即可获得 10 分可用分!
#46
我很久以前做的,代码还可以优化一下;)
#47
考虑
#48
public static string SubstringByByte(string str, int byteLength)
{
char[] strs = str.ToCharArray();
string strings = null;
if (byteLength == 0)
return strings;
foreach (char temp in strs)
{
byte[] bytes = Encoding.UTF8.GetBytes(temp.ToString());
strings += temp.ToString();
byteLength = byteLength - bytes.Length;
if (byteLength <= 0)
break;
}
return strings;
}
{
char[] strs = str.ToCharArray();
string strings = null;
if (byteLength == 0)
return strings;
foreach (char temp in strs)
{
byte[] bytes = Encoding.UTF8.GetBytes(temp.ToString());
strings += temp.ToString();
byteLength = byteLength - bytes.Length;
if (byteLength <= 0)
break;
}
return strings;
}
#49
package lihan;
/**
*
*
* 关于java按字节截取带有汉字的字符串的解法
* @author 李晗
*
*/
public class test{
public void splitIt(String splitStr, int bytes) {
int cutLength = 0;
int byteNum = bytes;
byte bt[] = splitStr.getBytes();
System.out.println("Length of this String ===>" + bt.length);
if (bytes > 1) {
for (int i = 0; i < byteNum; i++) {
if (bt[i] < 0) {
cutLength++;
}
}
if (cutLength % 2 == 0) {
cutLength /= 2;
}else
{
cutLength=0;
}
}
int result=cutLength+--byteNum;
if(result>bytes)
{
result=bytes;
}
if (bytes == 1) {
if (bt[0] < 0) {
result+=2;
}else
{
result+=1;
}
}
String substrx = new String(bt, 0, result);
System.out.println(substrx);
}
public static void main(String args[]) {
String str = "我abc的DEFe呀fgsdfg大撒旦";
int num =3;
System.out.println("num:" + num);
test sptstr = new test();
sptstr.splitIt(str, num);
}
}
#50
不错,收藏了。
#1
用 byte数组 方式 截取的时候判断 截的位置 是否在
GBK编码格式的 中文区域内 这样?
好象有点笨 效率有问题
我去写写看!!!
GBK编码格式的 中文区域内 这样?
好象有点笨 效率有问题
我去写写看!!!
#2
你要截取的是"字节",那应该会出乱码吧
#3
转换
#4
截半个汉字会有乱码 这种情况下舍掉半个汉字
#5
不错的帖子,想想
#6
比较困难。
#7
mark下
#8
我也遇到过同样的面试题,真是麻烦,只想到了stringStream的方法,按字符数截取,按字节的自己搞不懂,关注
#9
判断最后取的2个字节是否属于一个汉字?先标记帖子
#10
想想
#11
等待答案,学习学习
#12
我在别的地方找了一段代码
public static String substring(String str, int toCount,String more)
{
int reInt = 0;
String reStr = "";
if (str == null)
return "";
char[] tempChar = str.toCharArray();
for (int kk = 0; (kk < tempChar.length && toCount > reInt); kk++)
{
String s1 = str.valueOf(tempChar[kk]);
System.out.print(s1);
byte[] b = s1.getBytes();
reInt += b.length;
reStr += tempChar[kk];
}
if (toCount == reInt || (toCount == reInt - 1))
reStr += more;
return reStr;
}
public static String substring(String str, int toCount,String more)
{
int reInt = 0;
String reStr = "";
if (str == null)
return "";
char[] tempChar = str.toCharArray();
for (int kk = 0; (kk < tempChar.length && toCount > reInt); kk++)
{
String s1 = str.valueOf(tempChar[kk]);
System.out.print(s1);
byte[] b = s1.getBytes();
reInt += b.length;
reStr += tempChar[kk];
}
if (toCount == reInt || (toCount == reInt - 1))
reStr += more;
return reStr;
}
#13
貌似有点麻烦!
#14
真不好意思 ,我是初学的,水平有限
#15
有点意思
#16
网上能搜到
#17
一个一个截 截好判断是否是数字或E文
如果是就 append 如果不是就截2个
我是这么个思路!
如果是就 append 如果不是就截2个
我是这么个思路!
#18
百度 N 多回答的。
#19
public static string SubstringByByte(string str, int byteLength)
{
char[] strs = str.ToCharArray();
string strings = null;
if (byteLength == 0)
return strings;
foreach (char temp in strs)
{
byte[] bytes = Encoding.UTF8.GetBytes(temp.ToString());
strings += temp.ToString();
byteLength = byteLength - bytes.Length;
if (byteLength <= 0)
break;
}
return strings;
}
虽然有点麻烦,不过好像能行
{
char[] strs = str.ToCharArray();
string strings = null;
if (byteLength == 0)
return strings;
foreach (char temp in strs)
{
byte[] bytes = Encoding.UTF8.GetBytes(temp.ToString());
strings += temp.ToString();
byteLength = byteLength - bytes.Length;
if (byteLength <= 0)
break;
}
return strings;
}
虽然有点麻烦,不过好像能行
#20
谁有更好的方案学习学习
#21
載字節時應該出現亂碼!!
mark
mark
#22
//用C#实现一个:
static string GetSubString(string str, int byteCount)
{
int count = 0;
string result = string.Empty;
foreach (char ch in str)
{
count += System.Text.Encoding.Default.GetByteCount(ch.ToString());
if (count > byteCount) break;
result += ch.ToString();
}
return result;
}
static void Main(string[] args)//调用
{
string str = "我ABC汉DEF";
for (int i = 1; i < 10; i++)
{
Console.WriteLine("截出"+i+"个字节:");
Console.WriteLine(GetSubString(str, i));
}
}
/*输出结果:
截出1个字节:
截出2个字节:
我
截出3个字节:
我A
截出4个字节:
我AB
截出5个字节:
我ABC
截出6个字节:
我ABC
截出7个字节:
我ABC汉
截出8个字节:
我ABC汉D
截出9个字节:
我ABC汉DE
*/
#23
asdfsadfasdfasdf
#24
不太明白 你说的。。。
#25
顶!
#26
#27
public class Test {
/**
* @param args
*/
public void output(int count,String str)
{
int index=0;
boolean flag=false;
for(int i=0;i<str.length()&& index<count;i++)
{
char c=str.charAt(i);
if(c>=0 && c<=255)
{
flag=true;
index++;
System.out.println(c);
}
if(flag==false)
{
index+=2;
if(index<=count)System.out.println(c);
}
flag=false;
}
}
public static void main(String[] args) {
Test t=new Test();
t.output(6,"ab@毕AKDJSD");
}
}
#28
JDK1.5以上直接substring就可以了,不会半个汉字的。
#29
要好好学习。我是刚学习的。向你们学习.
#30
mark
#31
mark
#32
sdsdfsdfsdf
#33
- - !!!!!!!!!!!!
#34
学习!
#35
学习中!
#36
public String getResult(String input,int num)
{
int max=getBytes(input).length;
//判断特殊情况
if(num<=0||num>=max)return input;
//重原始字符串得到字符数组
char [] cs = input.toCharArray();
//要得到固定字节的数组
char [] rs = new char[num];
for(int i=0;i<num;i++)
{
//判断字符是否汉字,是最后一次循环并且是汉字,直接退出循环;如果是汉字又不是最后一次循环,字节数num减一,相当与少循环一次,少个字符
if(cs[i].toString().getBytes().length!= cs[i].toString().length &&(i==num-1))
break;
else if(cs[i].toString().getBytes().length!= cs[i].toString().length &&(i<num-1))
num--;
rs[i]=cs[i];
}
return new String(rs);
}
{
int max=getBytes(input).length;
//判断特殊情况
if(num<=0||num>=max)return input;
//重原始字符串得到字符数组
char [] cs = input.toCharArray();
//要得到固定字节的数组
char [] rs = new char[num];
for(int i=0;i<num;i++)
{
//判断字符是否汉字,是最后一次循环并且是汉字,直接退出循环;如果是汉字又不是最后一次循环,字节数num减一,相当与少循环一次,少个字符
if(cs[i].toString().getBytes().length!= cs[i].toString().length &&(i==num-1))
break;
else if(cs[i].toString().getBytes().length!= cs[i].toString().length &&(i<num-1))
num--;
rs[i]=cs[i];
}
return new String(rs);
}
#37
解释的不是很清楚,我自己写的,验证通过,没问题
/**
* 逐一的验证子串,得到获得临界的那个的位置 index
*
* @param s
* @param b
* @return
*/
public static String sss(String s, int b) {
int byteNum = b;// 记录要的字节数
String sub = "";// 保存子串
int index = 1;// 用于记录字符串的长度,比如: 我AB 长度是3,而不是字节数4
for (int i = 1; i <= s.toCharArray().length
&& byteNum - sub.getBytes().length > 0; i++) {
sub = s.substring(0, i);
index = i - 1;
}
if (byteNum - sub.getBytes().length == 0) {// 如果正好满足临界条件,就直接返回sub
return sub;
} else {
return s.substring(0, index);// 如果不满足,就减少一个字符(i-1),确保比限定的字节小
}
}
#38
截取字节和字符似乎没有什么难度,唯一的难度其实就是判断接触去的是个什么东西了。。
给出我的方式吧,自己感觉是最方便的
写个方法,方法中代码如下,功能就是判断是字符还是非字符,然后调用这个判断下就可以了
if (sChar.CompareTo("a") >= 0 && sChar.CompareTo("z") <= 0)
bReturn = true;
if (sChar.CompareTo("A") >= 0 && sChar.CompareTo("Z") <= 0)
bReturn = true;
else
bReturn = false;
给出我的方式吧,自己感觉是最方便的
写个方法,方法中代码如下,功能就是判断是字符还是非字符,然后调用这个判断下就可以了
if (sChar.CompareTo("a") >= 0 && sChar.CompareTo("z") <= 0)
bReturn = true;
if (sChar.CompareTo("A") >= 0 && sChar.CompareTo("Z") <= 0)
bReturn = true;
else
bReturn = false;
#39
学习了。
#40
这个不错!
MARKED BY CNDO
#41
我没明白你的意思
#42
回帖是一种美德!每天回帖即可获得 10 分可用分!
#43
有点意思,我也做做看
#44
class CopyStrByByte{
private String str = ""; //字符串
private int copyNum = 0; //要复制的字节数
private String arrStr[]; //存放将字符串拆分成的字符数组
private int cutNum = 0; //已截取的字节数
private int cc = 0; //str中的中文字符数
public CopyStrByByte(String str,int copyNum){
this.str = str;
this.copyNum = copyNum;
}
public String CopyStr(){
arrStr = str.split(""); //将传的字符串拆分为字符数组
str = ""; // 清空,用于存放已截取的字符
for (int i = 0;i < arrStr.length;i++){
if (arrStr[i].getBytes().length == 1){ // 非汉字
cutNum = cutNum + 1;
str = str + arrStr[i];
} else if (arrStr[i].getBytes().length == 2) { //汉字
cc = cc + 1;
cutNum = cutNum + 2;
str = str + arrStr[i];
}
if (cutNum >= copyNum) break; //已截取的字符数大于或等于要截取的字符数
}
if (cutNum > copyNum){ //已截取的字符数大于要截取的字符数
return str.substring(0, copyNum - cc);
} else {
return str;
}
}
}
public class TestCopyStr{
public static void main(String args[]){
CopyStrByByte cp = new CopyStrByByte("as论者afs为什么",12);
System.out.println(cp.CopyStr());
}
}
#45
回帖是一种美德!每天回帖即可获得 10 分可用分!
#46
我很久以前做的,代码还可以优化一下;)
#47
考虑
#48
public static string SubstringByByte(string str, int byteLength)
{
char[] strs = str.ToCharArray();
string strings = null;
if (byteLength == 0)
return strings;
foreach (char temp in strs)
{
byte[] bytes = Encoding.UTF8.GetBytes(temp.ToString());
strings += temp.ToString();
byteLength = byteLength - bytes.Length;
if (byteLength <= 0)
break;
}
return strings;
}
{
char[] strs = str.ToCharArray();
string strings = null;
if (byteLength == 0)
return strings;
foreach (char temp in strs)
{
byte[] bytes = Encoding.UTF8.GetBytes(temp.ToString());
strings += temp.ToString();
byteLength = byteLength - bytes.Length;
if (byteLength <= 0)
break;
}
return strings;
}
#49
package lihan;
/**
*
*
* 关于java按字节截取带有汉字的字符串的解法
* @author 李晗
*
*/
public class test{
public void splitIt(String splitStr, int bytes) {
int cutLength = 0;
int byteNum = bytes;
byte bt[] = splitStr.getBytes();
System.out.println("Length of this String ===>" + bt.length);
if (bytes > 1) {
for (int i = 0; i < byteNum; i++) {
if (bt[i] < 0) {
cutLength++;
}
}
if (cutLength % 2 == 0) {
cutLength /= 2;
}else
{
cutLength=0;
}
}
int result=cutLength+--byteNum;
if(result>bytes)
{
result=bytes;
}
if (bytes == 1) {
if (bt[0] < 0) {
result+=2;
}else
{
result+=1;
}
}
String substrx = new String(bt, 0, result);
System.out.println(substrx);
}
public static void main(String args[]) {
String str = "我abc的DEFe呀fgsdfg大撒旦";
int num =3;
System.out.println("num:" + num);
test sptstr = new test();
sptstr.splitIt(str, num);
}
}
#50
不错,收藏了。