我所说的问题是this
问题陈述:
返回给定字符串的一个版本,对于字符串中的每个星号(*),星号和它左右的字符都消失了。所以“ab * cd”产生“ad”和“ab ** cd”也产生“ad”。
starOut(“ab * cd”)→“ad”
starOut(“ab ** cd”)→“ad”
starOut(“sm * eilly”)→“傻”
我得到的解决方案有点凌乱我使用了大约6个if语句和处理一个特定情况,寻找具有较小ifs的更清晰的解决方案。
请不要使用超过1个循环和集合或正则表达式。
以下是我的解决方案:
public String starOut(String str) {
String result="";
boolean currentFlag=false;
if(str.length()==0)
return result;
for(int i=0;i+1<str.length();i++)
{
if(str.charAt(i)=='*')
{
i+=1;
currentFlag=true;
continue;
}
if(str.charAt(i+1)=='*')
{
i+=2;
continue;
}
if((i>0)&&str.charAt(i-1)=='*')
{
continue;
}
result+=str.substring(i,i+1);
currentFlag=false;
}
if(!(currentFlag)&&(str.length()==3)&&(str.charAt(1)=='*'))
return "";
if((str.charAt(str.length()-1)!='*')&!(currentFlag))
return result+=str.charAt(str.length()-1);
else
return result;
}
答案 0 :(得分:6)
<强>伪代码:强>
逐步浏览字符串中的所有字符。如果你登上星号,请不要记录。偷看,如果你看到一个星号,就不要记录下来。如果你看到一个星号,请向右看,不要记录它。如果上述情况均未发生,请记录下来。
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();
}
答案 1 :(得分:2)
我认为对这个问题使用正则表达式和模式匹配会很简单
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;
}
答案 2 :(得分: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;
}
答案 3 :(得分:1)
一个小时后写下这个......还是不喜欢它
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();
答案 4 :(得分:1)
简单有效。 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;
}
答案 5 :(得分:1)
这是我写的解决方案。它使用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;
}
答案 6 :(得分:1)
这是一个基于Andrew答案的略微修改的代码:
public String starOut(String str) {
String pattern = "([^*]{0,1})\\*+([^*]{0,1})";
return str.replaceAll(pattern, "");
}
答案 7 :(得分:1)
这是我的解决方法-
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;
}
答案 8 :(得分:0)
这是我的代码:
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;
}
答案 9 :(得分:0)
虽然这篇文章太旧了,已经有很多好的答案,而且由于我花了很多时间在这个练习背后,我还想通过提供我的答案来做出贡献。
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;
}
答案 10 :(得分:0)
export default class DayNames extends Component {
constructor(props) {
super(props);
this.state = {
isToggleOn: true
};
}
handleClick = e => {
this.setState(prevState => ({
isToggleOn: { ...prevState.isToggleOn, [e]: !prevState.isToggleOn[e] }
}));
};
render() {
//Getting number of days of month
const month = new Date().getMonth() + 1;
const year = new Date().getFullYear();
const numberDaysOfMonth = new Date(year, month, 0).getDate();
let foo1 = [];
for (let i = 1; i <= numberDaysOfMonth; i++) {
foo1.push(i);
}
let foo2 = ["Ops1", "Ops2", "Ops3", "Ops4", "Ops5", "Ops6"];
const ops = foo2.map((elem, index) => {
return (
<div className="ops_header" key={index}>
{elem}
{foo1.map((cell, i) => {
return (
<div
className="operator"
data-id={cell}
key={i}
onClick={() => this.handleClick(i)}
>
{this.state.isToggleOn[i] ? "Holiday" : cell}
</div>
);
})}
</div>
);
});
return (
<div>
<div className="table">{ops}</div>
</div>
);
}
}
答案 11 :(得分:0)
这是我的解决方法...
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;
}
答案 12 :(得分:0)
如果先反转条件检查,则可以减少代码行数。
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;
}
答案 13 :(得分:-1)
您可以在startOut方法中使用正则表达式来完成要求。
public static String starOut(String str) {
return str.replaceAll ( ".?[/*]+.?", "");
}
正则表达式的说明:
表达式开头和结尾的.?
匹配任何单个字符(如果它位于行的开头或结尾,则不匹配)。表达式中间的[/*]+
与一颗或多颗恒星匹配。