自己写了下迅雷面试题中的一道题

xingqiliudehuanghun 2009-11-30 11:16:26
从网上http://www.javaeye.com/topic/534012看到了这个迅雷的面试题。对其中字符串的替换部分
比较感兴趣,回家后忍不住自己写了下。写过之后自己才发现这些看似不起眼的小题目做起来不是
那么容易的,功夫不到家啊。
package com.saturday;

public class KMP {
public static String myReplaceAll(
String input,
String replaced){

//短路掉不可能匹配的情况
if(replaced.equals("")
||input.length()<replaced.length()){
return input;
}

StringBuffer buf=new StringBuffer();
char[] s=input.toCharArray();
char[] r=replaced.toCharArray();

int rLen=r.length;
int matchCount;

for(int i=0,sLen=s.length;i<sLen;){
if(i<sLen-rLen){
//检查匹配
matchCount=0;
for(int j=0;j<rLen;j++){
if(s[i+j]==r[j]){
matchCount++;
}else{
break;
}
}
//完全匹配
if(matchCount==rLen){
i+=rLen;
continue;
}
//部分匹配
if(matchCount>0){
for(int j=0;j<matchCount;j++){
buf.append(s[i++]);
}
continue;
}
}

buf.append(s[i++]);
}

return buf.toString();
}


public static void main(String[] args){
String input="123 mfc mf fc mfdC mfmfc cmfc dd abc";
String replaced="1234";

System.out.println(
myReplaceAll(input,replaced).equals(input.replaceAll(replaced,""))
);
}
}

...全文
761 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
chaofengwang09 2010-12-01
  • 打赏
  • 举报
回复
那哪位牛人做出来了?让我看下啊
holsten32 2010-01-05
  • 打赏
  • 举报
回复
它说不能用String的方法啊
ghostmye 2010-01-05
  • 打赏
  • 举报
回复
帮顶。。还得学习
nanyang421 2009-12-21
  • 打赏
  • 举报
回复
ding
haoyyy 2009-12-20
  • 打赏
  • 举报
回复
理解错了,如果是一个一个字符,确实没有什么意思。
haoyyy 2009-12-20
  • 打赏
  • 举报
回复
如果是字符串“ab3”的话就是数据结构里面的“模式匹配”问题。《数据结构》中有经典算法!
如果是一个一个字符,我认为用一个全局字符串,然后递归实现判断和字符串处理。吃完饭后试着写写。
groovy2007 2009-12-20
  • 打赏
  • 举报
回复
莫名其妙,不用字符串类的方法怎样才能得到其中的字符呢? 简直就是吃饱了撑的
StringBuilder能用吗?StringBuffer能用吗?
gy19890220 2009-12-20
  • 打赏
  • 举报
回复
学习
yang677888 2009-12-20
  • 打赏
  • 举报
回复
帮顶 学习
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bao110908 的回复:]
楼主你写的这个是替换什么啊?

原题是:

假如有字符串“6sabcsssfsfs33” ,用最有快速的方法去掉字符“ab3”,不能用java内置字符串方法(indeOf,substring,replaceAll等)?

我的理解是去掉字符 a、b 和 3 三个字符。
[/Quote]
我的理解是去掉字符串"ab3",而不是简单的去掉字符a、b、3,因为那样没有太大的实际意义
  • 打赏
  • 举报
回复
是啊
xingqiliudehuanghun 祝福
yang677888 2009-12-01
  • 打赏
  • 举报
回复
收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 转:迅雷亲历面经:笔试+上机+面试(完整JAVA面试题求解大讨论)

http://topic.csdn.net/u/20091129/21/4bbf398d-431a-4f8e-accc-b8de6572b8af.html?seed=1223878737&r=61557722#r_61557722
yang677888 2009-12-01
  • 打赏
  • 举报
回复
看看 学习啦

谢谢分享
  • 打赏
  • 举报
回复
如果连 String#toCharArray() 都不能用的话,那就没办法做了。

要从一个字符串中拿到东西必须使用 String 中的方法!
  • 打赏
  • 举报
回复
楼主你写的这个是替换什么啊?

原题是:

假如有字符串“6sabcsssfsfs33” ,用最有快速的方法去掉字符“ab3”,不能用java内置字符串方法(indeOf,substring,replaceAll等)?

我的理解是去掉字符 a、b 和 3 三个字符。
jonay 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tkinjava 的回复:]
Java codepackage test;publicclass Myreplace {/**
*@param args*/publicstaticvoid main(String[] args) {// TODO Auto-generated method stub Myreplace.myReplaceAll("abcdefghhhhcedcdehabchhhh","?-
[/Quote]
这个方法一开始就用toCharArray,明显是String的内置方法,直接PASS
bobo364 2009-12-01
  • 打赏
  • 举报
回复
这题两天了还有人在研究,看来这题很有价值
  • 打赏
  • 举报
回复
看来喜欢这道题的不少
tkinjava 2009-12-01
  • 打赏
  • 举报
回复

package test;

public class Myreplace {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Myreplace.myReplaceAll("abcdefghhhhcedcdehabchhhh", "cde","!");
}


public static String myReplaceAll(String input,String regx,String rep)
{
// 特殊情况判断

char i [] = input.toCharArray();
char r [] = regx.toCharArray();
StringBuffer buf = new StringBuffer();
boolean b = false;
for(int k=0;k<i.length;k++)
{
if(i.length-r.length>0)
{
for(int j=0;j<r.length;j++)
{
System.out.println(i[k+j]+"是否匹配"+r[j]);
if(i[k+j]==r[j])
{
b=true;
}
else
{
b=false;
break;
}
}
}
if(b)
{
k+=regx.length()-1;
buf.append(rep);

}else
{
buf.append(i[k]);
}
}
System.out.println(input);
System.out.println(buf);
System.out.println(input.replace(regx, rep));


return input;
}

}

tkinjava 2009-12-01
  • 打赏
  • 举报
回复
package test;

public class Myreplace {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Myreplace.myReplaceAll("abcdefghhhhcedcdehabchhhh", "cde","!");
}


public static String myReplaceAll(String input,String regx,String rep)
{
// 特殊情况判断

char i [] = input.toCharArray();
char r [] = regx.toCharArray();
StringBuffer buf = new StringBuffer();
boolean b = false;
for(int k=0;k<i.length;k++)
{
if(i.length-r.length>0)
{
for(int j=0;j<r.length;j++)
{
System.out.println(i[k+j]+"是否匹配"+r[j]);
if(i[k+j]==r[j])
{
b=true;
}
else
{
b=false;
break;
}
}
}
if(b)
{
k+=regx.length()-1;
buf.append(rep);

}else
{
buf.append(i[k]);
}
}
System.out.println(input);
System.out.println(buf);
System.out.println(input.replace(regx, rep));


return input;
}

}
加载更多回复(5)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧