C# 数一数字符串中的箭头

C# 数一数字符串中的箭头,c#,.net,arrays,algorithm,data-structures,C#,.net,Arrays,Algorithm,Data Structures,我正在尝试编写代码来计算字符串中的箭头。我成功地运行了它,它运行正常 Arrow是这样的>-->或者我个人非常喜欢基于循环的解决方案(尽管您应该改进算法以减少大缩进;通过函数/递归)。但在这种特殊情况下,有更简单有效的解决方案;例如:依赖于Split,这允许轻松确定某些子字符串的重复次数 示例代码: string input = "<<>>--><--<<--<<>>>--><"; string[] te

我正在尝试编写代码来计算字符串中的箭头。我成功地运行了它,它运行正常


Arrow是这样的
>-->或者我个人非常喜欢基于循环的解决方案(尽管您应该改进算法以减少大缩进;通过函数/递归)。但在这种特殊情况下,有更简单有效的解决方案;例如:依赖于
Split
,这允许轻松确定某些子字符串的重复次数

示例代码:

string input = "<<>>--><--<<--<<>>>--><";

string[] temp = input.Split(new string[] { ">>-->", "<--<<" }, StringSplitOptions.None);
int totArrows = temp.Length - 1;
temp = input.Split(new string[] { ">>-->>-->", "<--<<--<<" }, StringSplitOptions.None);

totArrows = totArrows + temp.Length - 1; //4

我个人非常喜欢基于循环的解决方案(尽管您应该改进算法以减少大缩进;通过函数/递归)。但在这种特殊情况下,有更简单有效的解决方案;例如:依赖于
Split
,这允许轻松确定某些子字符串的重复次数

示例代码:

string input = "<<>>--><--<<--<<>>>--><";

string[] temp = input.Split(new string[] { ">>-->", "<--<<" }, StringSplitOptions.None);
int totArrows = temp.Length - 1;
temp = input.Split(new string[] { ">>-->>-->", "<--<<--<<" }, StringSplitOptions.None);

totArrows = totArrows + temp.Length - 1; //4

检查以下功能:

 public int CountArrow(String main)
    {
        int result = 0;
        try
        {
            String arrow1 = ">>-->";
            String arrow2 = "<--<<";
            for (int i = 0; i < main.Length; i++)
            {
                if (main.IndexOf(arrow1,i) == i)
                    result++;
                if (main.IndexOf(arrow2,i) == i)
                    result++;
            }
        }
        catch (Exception exception)
        {
        }
        return result;
    }
public int CountArrow(字符串主)
{
int结果=0;
尝试
{
字符串arrow1=“>>-->”;

String arrow2=“检查以下函数:

 public int CountArrow(String main)
    {
        int result = 0;
        try
        {
            String arrow1 = ">>-->";
            String arrow2 = "<--<<";
            for (int i = 0; i < main.Length; i++)
            {
                if (main.IndexOf(arrow1,i) == i)
                    result++;
                if (main.IndexOf(arrow2,i) == i)
                    result++;
            }
        }
        catch (Exception exception)
        {
        }
        return result;
    }
public int CountArrow(字符串主)
{
int结果=0;
尝试
{
字符串arrow1=“>>-->”;

String arrow2=“要满足所有规则,请在每行上运行此正则表达式并计算组
a
匹配的次数

var pattern = "((?<a><--<<)(?<a>--<<)*)|((?<a>>>--)*(?<a>>>-->))";
var counts = lines.Select(line => Regex.Matches(line,pattern)
                                       .Cast<Match>()
                                       .Sum(m=>m.Groups["a"].Captures.Count));
var模式=“(?)”;
var counts=line.Select(line=>Regex.Matches(line,pattern)
.Cast()
.Sum(m=>m.Groups[“a”].Captures.Count));

为您提供一个
IEnumerable
2,4,0

以满足所有规则,在每行上运行此正则表达式并计算组
a
匹配的次数

var pattern = "((?<a><--<<)(?<a>--<<)*)|((?<a>>>--)*(?<a>>>-->))";
var counts = lines.Select(line => Regex.Matches(line,pattern)
                                       .Cast<Match>()
                                       .Sum(m=>m.Groups["a"].Captures.Count));
var模式=“(?)”;
var counts=line.Select(line=>Regex.Matches(line,pattern)
.Cast()
.Sum(m=>m.Groups[“a”].Captures.Count));
为您提供一个
IEnumerable
2,4,0

这对于-FSA、FSM来说是一个很好的任务。您可以将状态枚举为右箭头的正数和左箭头的负数。
状态1、2、3、4对应于序列<代码>>、>>、>>-、>>-、>>-

更正-我考虑了带1'-'的箭头

您只需从左向右遍历字符串,FSA会根据当前状态和当前字符更改其状态

'>'  ..   1 (and increment arrow count)
'-'  ..   0
'<'  ..  -1
这对于-FSA、FSM来说是一个很好的任务。您可以将状态枚举为右箭头的正数和左箭头的负数。
状态1、2、3、4对应于序列<代码>>、>>、>>-、>>-、>>-

更正-我考虑了带1'-'的箭头

您只需从左向右遍历字符串,FSA会根据当前状态和当前字符更改其状态

'>'  ..   1 (and increment arrow count)
'-'  ..   0
'<'  ..  -1

下面是一个简单的单行程序:

string[] arrows = new[] { ">>-->", "<--<<" };

var count = Enumerable.Range(0, source.Length - 4).Count(i =>
    "><".Contains(s[i]) && arrows.Contains(source.Substring(i, 5)));

string[]arrows=new[]{“>>-->”,“这里有一个简单的单行程序:

string[] arrows = new[] { ">>-->", "<--<<" };

var count = Enumerable.Range(0, source.Length - 4).Count(i =>
    "><".Contains(s[i]) && arrows.Contains(source.Substring(i, 5)));

string[]arrows=new[]{“>>-->”,“这个问题的格式可能更适合,因为它已经起作用了。因为这些是规则模式,所以您考虑了一个while循环。它返回该模式第一次出现的索引。您可以搜索所有案例。您可能会注意到,如果您返回到这个问题,对于您选择的规则会有相当多的争议说明,以及它们与以下答案的比较。请您回顾并澄清情况。谢谢。此问题的格式可能更适合,因为它已经起作用了。因为这些是规则模式,您考虑过while循环和。它返回模式第一次出现的索引。您可以搜索所有案例。如y所示您可能会注意到,如果您回到这个问题,您所述的规则以及它们与下面的答案的比较会引起相当多的争议。请您回顾并澄清这种情况。谢谢。这不符合OPs要求。
-->
。这是不对的。引用OP:“Arrow是这样的
-->
@spender好吧,我的坏,很抱歉错卖了。这么小的东西需要下一票?!说真的吗?你现在可以删除下一票吗?根据OPs问题中的规则,下面的字符串
>-->-->-->-->-->
应该产生4的结果。”(你的最新编辑会数到3)。虽然我不能评论速度或效率,但正确性不是更重要吗?@spender尝试了一段时间后,我意识到用我最初的方法完全实现预期目标非常困难,所以我改变了它。这只是稍微慢一点(仍然比你的速度快很多:),非常清晰,可扩展,等等。这是我解决这个问题的方法(如果我能正确地分析它,不管怎样都不尝试给出工作的解决方案)。我希望我目前的疲劳不会引起任何错误(说真的,感谢你的贡献,但是聊天有点累:)),否则,我将在明天修复它。这不符合OPs要求。
-->-->
计数为1。这不对。引用OP:“Arrow是这样的
-->
@spender好吧,我的坏,很抱歉错卖了。这么小的东西需要下一票?!说真的吗?你现在可以删除下一票吗?根据OPs问题中的规则,下面的字符串
>-->-->-->-->-->
应该产生4的结果。”(你的最新编辑会数到3)。虽然我不能评论速度或效率,但正确性不是更重要吗?@spender在尝试了一段时间后,我意识到用我最初的方法完全实现预期目标非常困难,所以我改变了它。这只是稍微慢了一点(
string[] arrows = new[] { ">>-->", "<--<<" };

var count = Enumerable.Range(0, source.Length - 4).Count(i =>
    "><".Contains(s[i]) && arrows.Contains(source.Substring(i, 5)));