用Java编写Bat riddle starOut的有效解决方案
我说的问题是 问题陈述:用Java编写Bat riddle starOut的有效解决方案,java,algorithm,Java,Algorithm,我说的问题是 问题陈述: public static String starOut(String s) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == '*') continue; if (i > 0 && s.charAt(i - 1) == '*') continu
public static String starOut(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '*') continue;
if (i > 0 && s.charAt(i - 1) == '*') continue;
if (i < s.length() - 1 && s.charAt(i + 1) == '*') continue;
sb.append(s.charAt(i));
}
return sb.toString();
}
返回给定字符串的一个版本,其中对于字符串中的每个星号(),其左右两侧的星号和字符都将消失。所以“abcd”产生“ad”,而“ab**cd”也产生“ad”
starOut(“ab*cd”)→ “广告”
starOut(“ab**cd”)→ “广告”
starOut(“sm*eilly”)→ “傻”
我得到的解决方案有点混乱,我使用了大约6个if语句和一个特定案例的处理,寻找具有较小if的更干净的解决方案
请不要使用超过1个循环和集合或正则表达式
以下是我的解决方案:
publicstringstarout(stringstr){
字符串结果=”;
布尔currentFlag=false;
如果(str.length()==0)
返回结果;
对于(int i=0;i+10)和&str.charAt(i-1)='*')
{
继续;
}
结果+=str.substring(i,i+1);
currentFlag=false;
}
如果(!(currentFlag)和&(str.length()==3)和&(str.charAt(1)='*'))
返回“”;
if((str.charAt(str.length()-1)!='*')和!(currentFlag))
返回结果+=str.charAt(str.length()-1);
其他的
返回结果;
}
以下是我的想法
public String starOut(String str)
{
boolean lastIsStar = false;
String result = "";
for(int i = 0; i < str.length(); i++)
{
char c = str.charAt(i);
if(lastIsStar)
{
if(c != '*')
{
lastIsStar = false;
}
}
else if(c == '*')
{
lastIsStar = true;
if(i-1 > -1)
{
result = result.substring(0, result.length()-1);
}
}
else
{
result += c;
lastIsStar = false;
}
}
return result;
}
publicstringstarout(stringstr)
{
布尔lastIsStar=false;
字符串结果=”;
对于(int i=0;i-1)
{
result=result.substring(0,result.length()-1);
}
}
其他的
{
结果+=c;
lastIsStar=假;
}
}
返回结果;
}
伪代码:
public static String starOut(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '*') continue;
if (i > 0 && s.charAt(i - 1) == '*') continue;
if (i < s.length() - 1 && s.charAt(i + 1) == '*') continue;
sb.append(s.charAt(i));
}
return sb.toString();
}
单步遍历字符串中的所有字符。如果你降落在星号上,不要记录。向左看,如果看到星号,不要记录。向右看,如果你看到星号,不要记录。如果上述情况均未发生,则记录下来
Java代码:
public static String starOut(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '*') continue;
if (i > 0 && s.charAt(i - 1) == '*') continue;
if (i < s.length() - 1 && s.charAt(i + 1) == '*') continue;
sb.append(s.charAt(i));
}
return sb.toString();
}
公共静态字符串起始(字符串s){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i0&&s.charAt(i-1)='*')继续;
如果(i
注意:我看到许多答案弹出,它们将
String
对象连接到循环中,而不是使用StringBuilder
。不要那样做。是的。一个小时后,我写了这个。。。还是不喜欢
String result = "";
boolean toDelete = false;
boolean deleted = true;
for(int i=0; i < str.length(); i++){
if (str.charAt(i) != '*'){
if(toDelete == false) result += str.charAt(i);
toDelete = false;
deleted = false;
continue;
}
if(deleted == false){
result = result.substring(0,result.length()-1);
deleted = true;
}
toDelete = true;
}
return result.toString();
字符串结果=”;
布尔toDelete=false;
布尔删除=真;
对于(int i=0;i
简单有效。if可以与| |结合使用,但看起来更干净
public String starOut(String str) {
int i = 0 ;
for (int i = 0; i <str.length(); i++) {
if (str.charAt(i) == '*') continue;
if (i+1<str.length() && str.charAt(i+1) =='*') continue;
if (i>0 && str.charAt(i-1) !='*') continue;
ret += str.charAt(i);
}
return ret;
}
publicstringstarout(stringstr){
int i=0;
对于(inti=0;i,这里是我编写的解决方案。它使用1个循环
public String starOut(String str)
{
String ret = "";
for (int i = 0; i < str.length(); i++)
{
if (!( '*' == str.charAt(i)
|| i + 1 < str.length() && '*' == str.charAt(i+1)
|| i > 0 && '*' == str.charAt(i-1) ))
{
ret = ret + str.charAt(i);
}
}
return ret;
}
publicstringstarout(stringstr)
{
字符串ret=“”;
对于(int i=0;i0&&'*'==str.charAt(i-1)))
{
ret=ret+str.charAt(i);
}
}
返回ret;
}
我认为使用正则表达式和模式匹配解决这个问题会很简单
public String starOut(String str) {
String pattern = "([a-zA-Z0-9]{0,1})\\*+([a-zA-Z0-9]{0,1})";
str = str.replaceAll(pattern, "");
return str;
}
这是一个基于Andrew答案的稍加修改的代码:
public String starOut(String str) {
String pattern = "([^*]{0,1})\\*+([^*]{0,1})";
return str.replaceAll(pattern, "");
}
这是我的代码:
public String starOut(String str) {
String result = "";
for (int i=0; i<str.length(); i++) {
if (!(str.substring(Math.max(0, i-1), Math.min(str.length(), i+2)).contains("*"))) result += str.charAt(i);
}
return result;
}
publicstringstarout(stringstr){
字符串结果=”;
对于(int i=0;i虽然这篇文章太老了,已经有很多好的答案,而且由于我花了这么多时间在这个练习上,我也希望通过提供我的答案来做出贡献
public String starOut(String str)
{
String b = "";
if(str.length() == 1 && !str.equals("*"))
{
b = str;
}
for(int i=0; i<str.length()-1;i++)
{
if(str.charAt(i) != '*' && str.charAt(i+1) != '*')
{
b = b + str.charAt(i);
}
if(str.charAt(i) == '*' && str.charAt(i+1) != '*')
{
i = i+1;
}
}
if(str.length() > 1 && str.charAt(str.length()-2) != '*' && str.charAt(str.length()-1) != '*')
{
b = b + str.substring(str.length()-1);
}
return b;
}
publicstringstarout(stringstr)
{
字符串b=“”;
如果(str.length()==1&&!str.equals(“*”)
{
b=str;
}
对于(int i=0;i 1&&str.charAt(str.length()-2)!='*'&&str.charAt(str.length()-1)!='*')
{
b=b+str.substring(str.length()-1);
}
返回b;
}
您可以在startOut方法中使用正则表达式来满足需求
public static String starOut(String str) {
return str.replaceAll ( ".?[/*]+.?", "");
}
正则表达式的解释:
在表达式的开始和结束时,<代码> ./c>匹配任何单个字符(或者在一行的开头或结尾时没有字符)。表达式中的<代码> [/*] +<代码>匹配一个或多个星星。
< p>这里是我的解决方案-< /p>
public String starOut(String str) {
boolean prevWasStar = false;
String ans = "";
for (int i=0; i<str.length();i++){
int l = ans.length();
if (str.charAt(i)=='*'){
if (!prevWasStar){
if(i==0) l = l+1;
ans=ans.substring(0, l-1);
}
prevWasStar=true;
} else{
if(!prevWasStar) ans = ans + str.charAt(i);
prevWasStar = false;
}
}return ans;
}
publicstringstarout(stringstr){
布尔值prevWasStar=false;
字符串ans=“”;
对于(int i=0;ipublicsstringstarout(stringstr)
{
字符串ret=“”;
int i;
if(str.length()==0 | | str.equals(“*”)返回“”;
对于(i=0;str.charAt(i)='*';++i)
;
如果(i>0&&str.charAt(i-1)='*'))
++一,;
而(i
这是我的解决方案
public String starOut(String str) {
String result = "";
int i = 0;
while(i<str.length()){
if(i==0 && str.charAt(i)!='*') result = result + str.charAt(i);
if(i>0 && str.charAt(i-1)!='*' && str.charAt(i)!='*'){
result = result + str.charAt(i);
}
if(i>0 && str.charAt(i)=='*' && str.charAt(i-1)!='*'){
result = result.substring(0, result.length()-1);
}
i++;
}
return result;
}
publicstringstarout(stringstr){
字符串结果=”;
int i=0;
而(i0&&str.charAt(i-1)!='*'&&str.charAt(i)!='*'){
结果=结果+str.charAt(i);
}
如果(i>0&&str.charAt(i)='*'&&str.charAt(i-1)!='*'){
result=result.substring(0,result.length()-1);
}
i++;
}
返回结果;
}
如果先反转条件检查,则可以减少代码行
public static String starOut(String str) {
String answer = "";
for (int i = 0; i < str.length(); i++) {
if (!((i > 0 && str.charAt(i - 1) == '*') ||
(str.charAt(i) == '*') ||
(i < str.length() - 1 && str.charAt(i + 1) == '*'))) {
answer += str.charAt(i);
}
}
return answer;
}
公共