5

エントリー レベルの C# 開発者の役割の面接で、次のタスクを完了するために 30 分が与えられました。

文字列を受け取り、インデックス (i) で部分文字列が

(i) の左側を反転すると、(i) の右側の部分文字列に等しくなります。

例: 「レースカー」

index(3) では、左側の部分文字列は "rac" であり、反転すると右側の部分文字列 "car" に等しくなります。

(i) そのような条件が満たされた場合、eslse は -1 を返します。文字列の長さが 3 未満の場合は 0 を返します。

  if (str.Length < 3)
            return -1;

        for (int i = 0; i < str.Length - 1; i++)
        {
            if(str[i-1] == str [i+1])
               return i;
        }
                return -1;
4

9 に答える 9

3

i != n/2false を返す必要がある場合は、以下を確認してi==n/2ください。

int n = str.Length;
for (int i=0;i<=n/2;i++)
{
   if (str[i] != str[n-i-1])
     return -1;
}
return n/2;
于 2012-04-30T07:09:59.823 に答える
1

私はこれを思いつきましたが、彼らがこれを尋ねたとき、あなたが Visual Studio の前に座っていたことを本当に願っています...

using System.Linq;

class Program {

    // New version: in fact, we are only looking for palindromes
    // of odd length
    static int FancyQuestion2(string value) {
        if (value.Length % 2 == 0) {
            return -1;
        }
        string reversed = new string(value.ToCharArray().Reverse().ToArray());
        if (reversed.Equals(value,  StringComparison.InvariantCultureIgnoreCase)) {
            return (int)(value.Length / 2);
        }
        return -1;
    }

    static void Main(string[] args) {
        int i1 = FancyQuestion2("noon"); // -1 (even length)
        int i2 = FancyQuestion2("racecar"); // 3
        int i3 = FancyQuestion2("WasItACatISaw"); // 6
    }
}
于 2012-04-30T07:14:17.493 に答える
0
 public static int check(string str)
    {
        if(str.Length < 3)
            return 0;

        int n = str.Length;
        int right = str.Length-1;
        int left = 0;

        while (left < right)
        {
            if (str[left] != str[right])
                return -1;

            left++;
            right--;
        }
        return n / 2;
    }
于 2012-04-30T07:06:42.067 に答える
0

純粋な C ですが、このワークフローが目的を達成するのに役立つことを願っています。これを共有してくれてありがとう。

int is_palindrome (const char str[], unsigned int index)
{
    int len = strlen(str);
    int result = index;

    //index not valid?
    if (index >= len)
        return -1;

    int i;
    for (i = 0; ((index+i) < len && (index - i) >= 0); ++i) {
        if(str[index-i] != str[index+i])
            return -1;
        else
            continue;
    }

    return result;
}
于 2012-04-30T07:31:22.387 に答える
0

あなたのアプローチは正しいですが、実装は間違っています。i文字列の(おそらく)中心文字のインデックスが含まれているため、 とは異なるループ変数が必要です。

また、ループ内からインデックスを返すことはできません。その場合、1 組の文字のみをチェックします。文字列をループしてから、結果を確認する必要があります。

int checkPalindrome(string str, int i) {
  // check that the index is at the center of the string 
  if (i != str.Length - i - 1) {
    return -1;
  }
  // a variable to keep track of the state
  bool cont = true;
  // loop from 1 until you reach the first and last characters
  for (int j = 1; cont && i - j >= 0; j++) {
    // update the status
    cont &= str[i - j] == str[i + j];
  }
  // check if the status is still true
  if (cont) {
    return i;
  } else {
    return -1;
  }
}
于 2012-04-30T07:33:11.917 に答える
0
  public static bool check(string s, int index)
        {

            if (s.Length < 3)
                return false;

            string left = s.Substring(0, index);
            Char[] rightChars = s.Substring(index + 1).ToCharArray();
            Array.Reverse(rightChars);
                string right =new string (rightChars);
                return left.Equals(right);
        }
于 2012-04-30T07:16:20.830 に答える
0

別のアプローチ、返されたときに-1をテストします。私が考えることができる最短:

using System;
public class Test
{
    public static void Main()
    {       
            TestPal( "Michael", 3 );                
            TestPal( "racecar", 3 );
            TestPal( "xacecar", 3 );
            TestPal( "katutak", 3 );
            TestPal( "able was i ere i saw elba", 7 );
            TestPal( "radar", 2 );
            TestPal( "radars", 2 );
            // This is false, space is not ignored ;-)
            TestPal( "a man a plan a canal panama", 9 );
    }

    static void TestPal(string s, int count) {
        Console.WriteLine( "{0} : {1}", s, IsBothEndsPalindrome(s, count) );
    }

    static bool IsBothEndsPalindrome(string s, int count) {           
        while(--count >= 0 && s[count] == s[s.Length - count - 1]);        
        return count == -1;
    }
}

出力:

Michael : False
racecar : True
xacecar : False
katutak : True
able was i ere i saw elba : True
radar : True
radars : False
a man a plan a canal panama : False

注: 最後の 1 つは False です。スペースはコードによって無視されません。

于 2012-04-30T08:27:08.630 に答える
0

try this

 static void Main(string[] args)
    {
        string theword = Console.ReadLine();
        char[] arrSplit = theword.ToCharArray();
        bool status = false;
        for (int i = 0; i < arrSplit.Length; i++)
        {
            if (i < theword.Length)
            {
                string leftWord = theword.Substring(0, i);
                char[] arrLeft = leftWord.ToCharArray();
                Array.Reverse(arrLeft);
                leftWord = new string(arrLeft);
                string rightWord = theword.Substring(i + 1, theword.Length - (i + 1));
                if (leftWord == rightWord)
                {
                    status = true;
                    break;
                }
            }
        }
        Console.Write(status);
        Console.ReadLine();
    }
于 2012-04-30T07:27:07.267 に答える
0

これは私が考えることができる最短です:

using System;
public class Test
{
    public static void Main()
    {            
        string example = "racecar";
        bool isPal = IsBothEndsPalindrome(example, 3);
        Console.WriteLine(isPal);
    }

    static bool IsBothEndsPalindrome(string s, int i) {
        while(i-- > 0) {
            if(s[i] != s[s.Length - i - 1]) return false;
         }
         return true;
    }
}

操作方法: http://ideone.com/2ae3j

于 2012-04-30T07:46:22.707 に答える