题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。...我们的字符串替换,主要的消耗是在移位上,每遇到一个空格,后面的字符串就往后移位,那么之前的移位都没有作用了。我们知道...
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解题思路
老实说,看到这个题目想到的就是字符串替换,但是面试题肯定不是这么简单的,那么怎么在原字符串上进行高效的替换呢?我们的字符串替换,主要的消耗是在移位上,每遇到一个空格,后面的字符串就往后移位,那么之前的移位都没有作用了。我们知道字符串的长度,知道替换字符串的长度,如果还知道空格的多少,那么这个字符串的长度就知道了。知道长度之后,只需要把数据放到响应的位置就可以了。
步骤:
1. 遍历字符串,统计出空格数量
2. 再遍历一次,完成替换
代码实现
普通解法,直接替换字符串
public static string ReplaceSpaceForSimple(stringstr)
{return str.Replace(" ", "%20");
}
精妙解法数据移位
public static string ReplaceSpace(stringstr)
{int count = 0;foreach (var item instr)
{if (item == ' ')
{
count++;
}
}int oLength =str.Length;int length = oLength + count * 2; //"%20".Length-1
char[] tempArray = new char[length]; //新开辟了一个空间
length--;for (int i = oLength - 1; i >= 0; i--)
{if (str[i] == ' ')
{
tempArray[length--] = '0';
tempArray[length--] = '2';
tempArray[length--] = '%';
}else{
tempArray[length--] =str[i];
}
}return new string(tempArray);
}
赋值给另外一个
public static string ReplaceForBS(stringstr) {
StringBuilder sb= newStringBuilder();foreach (var item instr) {if (item == ' ')
{
sb.Append("%20");
}else{
sb.Append(item);
}
}returnsb.ToString();
}
测试
中间空格
[Fact]public voidMiddle()
{string str = "We Are Happy.";
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
View Code
开始空格
[Fact]public voidStart()
{string str = "We Are Happy.";
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
View Code
结束空格
[Fact]public voidEnd()
{string str = "We Are Happy.";
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
多空格
[Fact]public voidMore()
{string str = "We Are Happy.";
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
空字符串
[Fact]public voidEmpty()
{string str = "";
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
str= " ";
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
str= " ";
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
View Code
结果
想入非非:扩展思维,发挥想象
1. 这个题可以扩展为替换其他的数据,不要局限于单一的替换,URL就是ASCII替换
2. 字符串是一种特殊的char[]
3. 熟悉字符串string,stringbuilder
然后在Java后台中去读取(使用BufferedReader的readline方法),但是读取后的Json字符串总是带着一部分空白,使用了多种替换方式(trim,空格,换行符,制表符等)都无法消除空格,导致后续创建json对象时提示错误。...
一、自己的问题
先说一下自己碰到的问题,自己在本地建立了一个json文件,并且把它格式化了(为了看着美观);然后在Java后台中去读取(使用BufferedReader的readline方法),但是读取后的Json字符串总是带着一部分空白,使用了多种替换方式(trim,空格,换行符,制表符等)都无法消除空格,导致后续创建json对象时提示错误。
原因:是因为这个读取到的不是Java常见的空格字符,而是特殊的空格(ASCII值160,严格来说这个是扩展ASCII值的部分,因为原生ASCII最大只到127),因此不能使用常规的替换方式。
具体处理见下文(转载的博客,为了加深记忆,特意又放到自己的博客中)。
二、处理办法
最近遇到个问题,在页面的搜索框输入带有空格的字符串时,总是无法从db中搜索出来对应的数据,于是将db里的空格复制出来,发现其ASCII码值为160,这才知道,原来ASCII码中除了32之外还有160这个特殊的空格。下边是查看字符对应ASCII值的逻辑:
1 final char c1 = ' '; //db里的空格
2 final char c2 = ' '; //手动输入的空格
3 System.out.println((int)c1); //160
4 System.out.println((int)c2); //32
平时我们用键盘输入的空格的ASCII值是32,而这个ASCII值为160的空格,其实是不间断空格(non-breaking space),是不是从来没听说过这东东?其实你平时一定也用过很多次的,就是页面上的所产生的空格。
不间断空格non-breaking space的缩写正是nbsp。这中空格的作用就是在页面换行时不被打断,如下:
1 页面某一行的末尾是一个人名Zhang Xiaoming
我们希望在换行时人名不会被打断,导致Zhang 在第一行末尾,而Xiaoming跑到第二行开头,而是保持完整的人名在同一行的末尾,于是就有了不间断空格。(在word中也有这种空格的使用)
如果使用了平常的空格,就会被页面压缩,变成下边这样
1 页面某一行的末尾是一个人名Zhang2 Xiaoming
问题
但是不间断空格有个问题,就是它无法被trim()所裁剪,也无法被正则表达式的\s所匹配,也无法被StringUtils的isBlank()所识别,也就是说,无法像裁剪寻常空格那样移除这个不间断空格。
我们可以利用不间断空格的Unicode编码来移除它,其编码为\u00A0。
解决办法如下:
1 replace("\u00A0", "")2 replaceAll("\\u00A0+", "") //这是正则表达式的写法
4 String str = "aacsdfe "; //包含了不间断空格的字符串
5 str = str.replace("\u00A0", "");6 str = str.replaceAll("\\u00A0+", "");
以上内容非个人原创。
附原文链接:https://blog.csdn.net/lewky_liu/article/details/79353151
然后在Java后台中去读取(使用BufferedReader的readline方法),但是读取后的Json字符串总是带着一部分空白,使用了多种替换方式(trim,空格,换行符,制表符等)都无法消除空格,导致后续创建json对象时提示错误。...
一、自己的问题
先说一下自己碰到的问题,自己在本地建立了一个json文件,并且把它格式化了(为了看着美观);然后在Java后台中去读取(使用BufferedReader的readline方法),但是读取后的Json字符串总是带着一部分空白,使用了多种替换方式(trim,空格,换行符,制表符等)都无法消除空格,导致后续创建json对象时提示错误。
原因:是因为这个读取到的不是Java常见的空格字符,而是特殊的空格(ASCII值160,严格来说这个是扩展ASCII值的部分,因为原生ASCII最大只到127),因此不能使用常规的替换方式。
具体处理见下文(转载的博客,为了加深记忆,特意又放到自己的博客中)。
二、处理办法
最近遇到个问题,在页面的搜索框输入带有空格的字符串时,总是无法从db中搜索出来对应的数据,于是将db里的空格复制出来,发现其ASCII码值为160,这才知道,原来ASCII码中除了32之外还有160这个特殊的空格。下边是查看字符对应ASCII值的逻辑:
final char c1 = ' '; //db里的空格
final char c2 = ' '; //手动输入的空格
System.out.println((int)c1); //160
System.out.println((int)c2); //32
平时我们用键盘输入的空格的ASCII值是32,而这个ASCII值为160的空格,其实是不间断空格(non-breaking space),是不是从来没听说过这东东?其实你平时一定也用过很多次的,就是页面上的所产生的空格。
不间断空格non-breaking space的缩写正是nbsp。这中空格的作用就是在页面换行时不被打断,如下:
页面某一行的末尾是一个人名Zhang Xiaoming
我们希望在换行时人名不会被打断,导致Zhang 在第一行末尾,而Xiaoming跑到第二行开头,而是保持完整的人名在同一行的末尾,于是就有了不间断空格。(在word中也有这种空格的使用)
如果使用了平常的空格,就会被页面压缩,变成下边这样
页面某一行的末尾是一个人名Zhang
Xiaoming
问题
但是不间断空格有个问题,就是它无法被trim()所裁剪,也无法被正则表达式的\s所匹配,也无法被StringUtils的isBlank()所识别,也就是说,无法像裁剪寻常空格那样移除这个不间断空格。
我们可以利用不间断空格的Unicode编码来移除它,其编码为\u00A0。
解决办法如下:
replace("\u00A0", "")
replaceAll("\\u00A0+", "") //这是正则表达式的写法
String str= "aacsdfe "; //包含了不间断空格的字符串
str = str.replace("\u00A0", "");
str= str.replaceAll("\\u00A0+", "");
本文不是个人原创。
附原文链接:https://blog.csdn.net/lewky_liu/article/details/79353151
一个字符串里面包含了一些位置不定的空格符,把里面所有的非空格字符找出来,把空格用‘,’替换。替换后的句子末尾必须有一个‘,’存在。例如“this is an demo”替换后应该为:"this,is,an,demo,"#include char *...
一个字符串里面包含了一些位置不定的空格符,把里面所有的非空格字符找出来,把空格用‘,’替换。
替换后的句子末尾必须有一个‘,’存在。
例如“this is an demo”替换后应该为:
"this,is,an,demo,"
#include
char *ReplaceString(const char *pInString, char *pOutString)
{
char *cp = pOutString ;
//去除字符串开头的若干空格
while(*pInString == ' ')
{
pInString ++;
}
while(*pInString)
{
*cp = *pInString;
cp++;
pInString++;
if(*pInString == ' ')
{
*cp= ',';
cp++;
pInString++;
}
}
*cp = '\0';
//最后一个字符用逗号结束
if(*(cp - 1) != ',')
{
*cp = ',';
*(++cp) = '\0';
}
return pOutString;
}
int main()
{
char *pin = " This is a demo";
char pout[100];
ReplaceString(pin, pout);
printf("%s \n", pin);
printf("%s \n", pout);
return 0;
}
本文章来分享一个利用java中替换去除字符串中的...replaceAll(String regex, String replacement)使用给定的 replacement字符串替换此字符串匹配给定的正则表达式的每个子字符串。示例代码: 代码如下 复制代码 ...
然后在Java后台中去读取(使用BufferedReader的readline方法),但是读取后的Json字符串总是带着一部分空白,使用了多种替换方式(trim,空格,换行符,制表符等)都无法消除空格,导致后续创建json对象时提示错误。...
1.trim()	是去掉首尾空格 2.str.replace(" ", "");	去掉所有空格,包括首尾、中间 3.或者replaceAll(" +","");...	可以替换大部分空白字符, 不限于空格 \s 可以匹配空格、制表符、换页符等空白字符的其中任意一个
java字符转换类代码,可以实现判断字符串是否为空,并删除首尾空格,字符串替换函数,代码转换,GBK转换为ISO-8859-1,代码转换 从srcCode转换为destCode,代码转换,GBK转换为big5,替换非法字符,标记本身等于分隔...
2、HTML标记有两种:单标记和双标记,单标记的语法格式: 3、不同的属性之间用空格间隔,属性值可以使用引号括起来,也可以不使用,HTML标记不区分大小写。4、颜色①颜色名称: ②16进制颜色代码:#RRGGBB “红绿蓝...
特别注意了Strim或者Trip都是只能去除头部和尾部的空...如果我自己写,我会采用foreache遍历每一个字符串中的字符然后利用StringBuilder追加 或者使用 Replace进行替换,替换的时候对于多个空格可能匹配有问题,利用...
用户输入一个字符创,以换行为结束符,把字符串中的空格替换成“20...public class字符串替换 {	/**	* @param args	*/	public static void main(String[] args) {	// TODO Auto-generated method stub	S...
要从字符串中删除换行符,空格和制表符,请如下所示将其替换为空。replaceAll("[\\n\\t]","");在上面,新行,制表符和空格将被替换为空,因为我们已经使用了 replaceAll()以下是完整的示例。示例publicclassDemo{...