0

到目前为止,我已经编写了这段代码来检查字符串是否有连续的升序或降序字符。这些是标记输入是否连续的不变量,如 89012 或 xyZabc 这样的字符串将计为连续。另一方面,09283dgdDDf 不算是连续的。诸如 AbCBa 或 1abC 之类的特殊情况应返回 false。另一方面 DcbaZ 应该返回 true

请注意,到目前为止,我的代码仅适用于字符部分,请帮助这个菜鸟使其工作。我有错误

import java.util.Scanner;
public class generalizedorder {

    public static void main(String[] args)
    {
        java.util.Scanner reader = new java.util.Scanner(System.in);
                 System.out.println("Enter the string");
                 String s = reader.next();
    }
public boolean checkForAscendingOrDescendingPart(String s, int l)
{
    for (int i = 0; i <= s.length() - l; ++i)
    {
        boolean success = true;
        char c = s.charAt(i);
        for (int j = 1; j < l; ++j)
        {
            if (((char) c + j) != s.charAt(i + j))
            {
                success = false;
                break;
            }
        }
        if (success) return true;

        success = true;

        for (int j = 1; j < l; ++j)
        {
            if (((char) c - j) != s.charAt(i + j))
            {
                success = false;
                break;
            }
        }
        if (success) return true;
    }
    return false;

}}
system.out.println(checkForAscendingOrDescendingPart);

}}
4

1 回答 1

0

我做了以下假设(根据您的描述):

  • 89012 - 因为“012”而连续
  • xyZabc - 因为“abc”而连续(不是“xyZ” - 区分大小写)
  • 09283dgdDDf - 不是
  • AbCBa 或 1abC - 不是(为什么? - 区分大小写加上假设至少 3 个连续字符。)
  • DcbaZ - 因为“cba”而连续

因此,您可以通过从头到尾迭代来做到这一点,考虑到n允许的最大连续出现次数并进行简单计算:

连续的字符具有“1”的 ASCI 差异。(消极或积极)。由于您想连续租用“abc”和“cba”,常见的情况是:它们的 ASCI 差异之和将为 2 或负 2。如果您想使用“4 chars”,则总和为 3或负 3。

  • ab -> 最大 ASCI 差异:1
  • abc -> 最大 ASCI 差异:2
  • cba -> 最大 ASCI 差异:-2
  • abcX012 -> 最大 ASCI 差异:2

因此,您不想|n-1|在比较连续字符时遇到问题,连续字符n的最大允许出现计数在哪里:

public boolean isConsecutive(String stringToTest, int n) {
    int sumOfDifferences = 0;
    int lastTemp = 0;
    Boolean consecutive = false;

    for (int i = 0; i < stringToTest.length() - 1; i++) {
        // Whenever the difference is 1 or minues 1, add it to sumOfDifferences.
        // when sumOfDifferences= |max -1| -> break: consecutive!
        // when difference > 1 or difference < -1 : Reset sumOfDifferences.
        // when temp != lastTemp : Reset sumOfDifferences.
        int temp = stringToTest.charAt(i) - stringToTest.charAt(i + 1);

        if (temp != lastTemp) {
            // ASCI directon change. reset. Otherwhise 214 will be consecutive. when comparing for 3 characters. (sumOfdifference would be 2 (-1 + 3)
            sumOfDifferences = 0;
        }

        if (temp == 1 || temp == -1) {
            sumOfDifferences += temp;
        } else {
            // way off. reset.
            sumOfDifferences = 0;
        }

        // sumOfDiff == |n-1| ?
        if (sumOfDifferences == n - 1 || sumOfDifferences == ((n - 1) * -1)) {
            consecutive = true;
            break;
        }

        lastTemp = temp;
    }
    return consecutive;
}

以下测试为阳性:

@Test
public void testcons() {
    assertEquals(true, isConsecutive("89012", 3));
    assertEquals(true, isConsecutive("xyZabc", 3));
    assertEquals(false, isConsecutive("09283dgdDDf", 3));
    assertEquals(false, isConsecutive("AbCBa", 3));
    assertEquals(false, isConsecutive("1abC", 3));
    assertEquals(true, isConsecutive("DcbaZ", 3));

    assertEquals(true, isConsecutive("ab", 2));
    assertEquals(true, isConsecutive("abc", 3));
    assertEquals(true, isConsecutive("abcd", 4));
    assertEquals(true, isConsecutive("abcde", 5));
    assertEquals(true, isConsecutive("abcdef", 6));
}

这适用于:数字和字母字符串。(即使是字母数字,但如果你不想要这个,你可以提前排除它们)

于 2013-10-20T01:01:12.550 回答