2013-07-30 4 views
2

Im пытается проверить, является ли строка палиндром или нет с использованием объектива c.Im новичок в программировании без какого-либо опыта в других языках программирования, так голый со мной, пожалуйста. Я застрял в моем условии if Я хочу сказать, что если первая позиция в строке равна последней, строка является палиндром.Проверьте, является ли строка палиндром в объекте c

Что я делаю неправильно?

int main (int argc, const char * argv[]) 
{ 
    NSString *p = @"121" ; 
    BOOL palindrome = TRUE; 
    for (int i = 0 ; i<p.length/2+1 ; i++) 
    { 
     if (p[i] != p [p.Length - i - 1]) 
        palindrome = false; 
    } 
    return (0); 
} 
+0

Ну, за одно ваше '{}' не сбалансированы. (Если вы получаете сообщение об ошибке при компиляции кода, вы всегда должны указать, что это такое - как написано, оказалось, что вы спрашивали о своей логике программы.) – geoffspear

+0

Другим трюком было бы обратить вспять строку (хорошо документирована) и test 'isEqualToString' –

+0

@RobvanderVeer Я не знаю, что реверсирование строки хорошо документировано. Можете ли вы предоставить ссылку? –

ответ

4

Помимо несбалансированных скобок, доступ символ из NSString является более сложным, чем при использовании массива обозначения. Вам нужно использовать метод characterAtIndex:. Вы можете оптимизировать свой код, вырвавшись из цикла, если палиндром невозможно, и вызов длины за пределами цикла for.

NSString *p = @"121"; 

NSInteger length = p.length; 
NSInteger halfLength = (length/2); 

BOOL isPalindrome = YES; 

for (int i = 0; i < halfLength; i++) { 
    if ([p characterAtIndex:i] != [p characterAtIndex:length - i - 1]) { 
     isPalindrome = NO; 
     break; 
    } 
} 

Может быть желательно проверить регистр нечувствительно. Чтобы сделать это, сделайте строкой все строчные буквы перед циклом, используя метод lowercaseString.

Как отметил Николай в комментариях, это будет работать только для строк, содержащих «нормальные» символы Unicode, что часто бывает неверным - например, при использовании UTF8 для иностранных языков. Если это возможно, используйте вместо этого следующий код, который проверяет составные последовательности символов, а не отдельные символы.

NSString *p = @"121"; 
NSInteger length = p.length; 

NSInteger halfLength = length/2; 

__block BOOL isPalindrome = YES; 

[p enumerateSubstringsInRange:NSMakeRange(0, halfLength) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
    NSRange otherRange = [p rangeOfComposedCharacterSequenceAtIndex:length - enclosingRange.location - 1]; 

    if (![substring isEqualToString:[p substringWithRange:otherRange]]) { 
     isPalindrome = NO; 
     *stop = YES; 
    } 
}]; 
+0

Это работает, только если вы убедитесь, что NSString не содержит суррогатных пар или комбинирует символы. Итерация символов Юникода не является тривиальной. –

+0

Обновлен с альтернативным фрагментом, который перечисляет написанные последовательности символов, а не только символы Unicode. –

+0

Что такое __блок? –

4

Вы пытаетесь использовать NSString как NSArray (или, возможно, как строка C), которая не будет работать. Вместо этого вам нужно использовать метод NSStringcharacterAtIndex:, чтобы проверить персонажа.

1

Как кажется, нет ответа еще, который обрабатывает составленную последовательность символов правильно я добавляю свои два цент:

NSString *testString = @"\u00E0 a\u0300"; // "à à" 

NSMutableArray *logicalCharacters = [NSMutableArray array]; 
[testString enumerateSubstringsInRange:(NSRange){0, [testString length]} 
           options:NSStringEnumerationByComposedCharacterSequences 
          usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) 
{ 
    [logicalCharacters addObject:substring]; 
}]; 

NSUInteger count = [logicalCharacters count]; 
BOOL isPalindrome = YES; 
for (NSUInteger idx = 0; idx < count/2; ++idx) { 
    NSString *a = logicalCharacters[idx]; 
    NSString *b = logicalCharacters[count - idx - 1]; 
    if ([a localizedCaseInsensitiveCompare:b] != NSOrderedSame) { 
     isPalindrome = NO; 
     break; 
    } 
} 

NSLog(@"isPalindrome: %d", isPalindrome); 

Это разбивает строку в массив логических символов (элементы строки, что нормальный пользователь будет называть «символ»).

+1

Спасибо за ответ, ребята, у меня есть еще один вопрос: как напечатать истинное или ложное значение как любое слово, которое я хочу? NSLog просто распечатывает их как 1 или 0. – user2384735

+0

@ user2384735 Вы должны разместить это как другой вопрос. –

+0

Я не хотел тратить какое-то пространство, но, честно говоря, открываю еще один вопрос. – user2384735

0
NSString *str=self.txtFld.text; 
int count=str.length-1; 

    for (int i=0; i<count; i++) { 
     char firstChar=[str characterAtIndex:i]; 
     char lastChar=[str characterAtIndex:count-i]; 
     NSLog(@"first=%c and last=%c",firstChar,lastChar); 
     if (firstChar !=lastChar) { 
      break; 
     } 
     else 
      NSLog(@"Pailndrome"); 
    } 
0
We can also do this using NSRange like this... 
enter code NSString *[email protected]"123321"; 
NSRange rangeforFirst=NSMakeRange(0, 1); 
NSRange rangeforlast=NSMakeRange(fullname.length-1, 1); 
BOOL ispalindrome; 
for (int i=0; i<fullname.length; i++) { 
    if (![[fullname substringWithRange:rangeforFirst] isEqualToString:[fullname substringWithRange:rangeforlast]]) { 
     NSLog(@"not match"); 
     ispalindrome=NO; 
     return; 
    } 
    i++; 
    rangeforFirst=NSMakeRange(i, 1); 
    rangeforlast=NSMakeRange(fullname.length-i-1, 1); 
} 
NSLog(@"no is %@",(ispalindrome) ? @"matched" :@"not matched"); 
0
NSString *str1 = @"racecar"; 
    NSMutableString *str2 = [[NSMutableString alloc] init]; 
    NSInteger strLength = [str1 length]-1; 
    for (NSInteger i=strLength; i>=0; i--) 
    { 
     [str2 appendString:[NSString stringWithFormat:@"%C",[str1 characterAtIndex:i]]]; 

    } 
if ([str1 isEqual:str2]) 
     { 
      NSLog(@"str %@ is palindrome",str1); 
     } 
1

Рекурсивный

- (BOOL)isPaliRec:(NSString*)str :(int)start :(int)end{ 
    if(start >= end) 
     return YES; 
    else if([str characterAtIndex:start] != [str characterAtIndex:end]) 
     return NO; 
    else 
     return [self isPaliRec:str :++start :--end]; 
} 

Non Рекурсивный

- (BOOL)isPali:(NSString*)str{ 
    for (int i=0; i<str.length/2; i++) 
     if([str characterAtIndex:i] != [str characterAtIndex:(str.length-i-1)]) 
     return NO; 

    return YES; 
} 

Вы можете позвонить:

NSString *str = @"arara"; 
[self isPaliRec:str :0 :(int)str.length-1]; 
[self isPali:str]; 

Swift 3:

// Recursive 
func isPaliRec(str: String, start: Int = 0, end: Int = str.characters.count-1) -> Bool { 
    if start >= end { 
     return true 
    } else if str[str.index(str.startIndex, offsetBy: start)] != str[str.index(str.startIndex, offsetBy: end)] { 
     return false 
    } else { 
     return isPaliRec(str: str, start: start+1, end: end-1) 
    } 
} 

// Non Recursive 
func isPali(str: String) -> Bool { 
    for i in 0..<str.characters.count/2 { 
     let endIndex = str.characters.count-i-1 
     if str[str.index(str.startIndex, offsetBy: i)] != str[str.index(str.startIndex, offsetBy: endIndex)] { 
      return false 
     } 
    } 
    return true 
} 

// Using 
let str = "arara" 
isPaliRec(str: str) 
isPali(str: str) 

Кроме того, вы можете использовать быстрые 3 метода, как string extension ... Это более элегантно.extension sample

1
@import Foundation; 

BOOL isPalindrome(NSString * str) 
{ 
    if (!str || str.length == 0) return NO; 
    if (str.length == 1) return YES; 
    for(unsigned i = 0; i < str.length/2; ++i) 
     if ([str characterAtIndex:i] != [str characterAtIndex:str.length - i - 1]) return NO; 
    return YES; 
} 

int main() { 
    @autoreleasepool { 
     NSLog(@"%s", isPalindrome(@"applelppa") ? "YES" : "NO"); 
    } return 0; 
} 
+0

именно то, что я искал! – Shantanu

1
var str: NSString = "123321" 
var length = str.length 
var isPalindrome = true 

for index in 0...length/2{ 
    if(str.characterAtIndex(index) != str.characterAtIndex(length-1 - index)){ 
     print("\(index)not palindrome") 
     isPalindrome = false 
     break 
    } 
} 

print("is palindrome: \(isPalindrome)") 
0
-(BOOL)checkPalindromeNumber:(int)number{ 
    int originalNumber,reversedNumber = 0,remainder; 
    originalNumber=number; 
    while (number!=0) { 
     remainder=number%10; 
     reversedNumber=(reversedNumber*10)+remainder; 
     number=number/10; 
    } 

    if (reversedNumber==originalNumber) { 
     NSLog(@"%d is Palindrome Number",originalNumber); 

     return YES; 
    } 
    else{ 
     NSLog(@"%d is Not Palindrome Number",originalNumber); 
     return NO; 

    } 
} 
Смежные вопросы