有趣的字符串代码

时间:2015-06-15 11:37:21

标签: c arrays string reverse

问题的链接是:https://www.hackerrank.com/challenges/funny-string

问题陈述

假设您有一个字符串S,其长度为N,索引范围为0到N-1。字符串R是字符串S的反转。如果条件| Si-S(i-1)| = | Ri-R(i-1)|,则字符串S很有趣。对于从1到N-1的每个i都是如此。

(注意:给定一个字符串str,stri表示str的第i个字符(0-indexed)的ascii值。| x |表示整数的绝对值x)

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main()
{
char r[10000],s[10000];
int t[10],i,j,n,c1,c2,l,f;
scanf("%d",&n);
for(i=0;i<=(n-1);i++)
{
    t[i]=0;
    c1=c2=0;f=0,l=0;
    gets(s);
    l=strlen(s);
    for(j=0;j<l;j++)
        r[j]=s[l-1-j];
    for(j=1;j<l;j++)
    {
        c1=abs((int)(s[j])-(int)(s[j-1]));
        c2=abs((int)(r[j])-(int)(r[j-1]));
        if(c1==c2)
            f=1;
        else
            f=0;
    }
    t[i]=f;
}
for(i=0;i<n;i++)
{
    if(t[i]==0)
        printf("Not Funny\n");
    else
        printf("Funny\n");
}
return 0;
}

这是我的代码 并且所需的输入/输出是

输入

  

2
acxz
bcxz


输出

  

有趣的不好笑


但是我得到了一个不同的输出,任何人都可以帮助我解决代码有什么问题,最糟糕的输出是测试用例值1.我没有得到它如何给出该值

4 个答案:

答案 0 :(得分:2)

你非常接近。

问题是在使用scanf缓冲区输入数字后,剩下一个\n字符被解释为字符串的结尾,所以第一个输入是空字符串(不,它不是滑稽)。在输入字符串之前,您需要清理缓冲区:

scanf("%d",&n);

应该是:

scanf("%d",&n);
while (getchar() != '\n');

现在它起作用了:

2
acxz
bcxz
Funny
Not Funny

当然,在弄清楚这一点后,听听人们发布的所有建议,作为对你的问题的评论。并在编译器中启用警告。

答案 1 :(得分:1)

1)您不需要将所有输出存储在一个阵列中并在以后打印,您可以同时打印它们,否则它可能会超出内存限制,实施它也会浪费您的时间

2)它无法正常工作的原因是因为scanf在缓冲区中留下\n。你可以在scanf

之后添加它来清除它
char clean;
while (clean=getchar()!='\n' && clean !=EOF);

答案 2 :(得分:0)

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {
        /*
         * Enter your code here. Read input from STDIN. Print output to STDOUT.
         * Your class should be named Solution.
         */
        String s;
        int t;

        Scanner in = new Scanner(System.in);
        t = in.nextInt();

        for (int f = 0; f < t; ++f) {
            s = in.next();
            getResult(s);
        }
        in.close(); 
    }

    public static int getAbsoluteValue(int a, int b) {
        int value = Math.abs(a - b);
        return value;
    }

    public static void getResult(String s) {
        char[] cArr;
        String sReverse = "";
        char[] cArrReverse;
        int count = 0;
        cArr = s.toCharArray();

        for (int i = cArr.length - 1; i >= 0; i--) {
            sReverse += cArr[i];
        }
        cArrReverse = sReverse.toCharArray();

        for (int i = 0; i < cArr.length - 1; i++) {
            int h = getAbsoluteValue(cArr[i + 1], cArr[i]);
            int k = getAbsoluteValue(cArrReverse[i + 1], cArrReverse[i]);

            if (h == k) {
                count++;

            }
        }
        if (count == cArr.length - 1) {
            System.out.println("funny");
        } else {
            System.out.println("not funny");
        }
    }

}

答案 3 :(得分:0)

int main() {

    char s[10000], r[10000];
    int times;
    scanf("%d", &times);
    for (int t = 0; t < times; t++) {
        scanf("%s", s);
        int len = strlen(s);
        for (int i = 0; i < len; i++) {
            r[i] = s[strlen(s) - i - 1];
        }
        int funny = 1;
        for (int i = 1; i < len; i++) {
            if (abs(r[i] - r[i-1]) != abs(s[i] - s[i-1])) {
                printf("Not Funny\n");
                funny = 0;
                break;
            }     
        }
        if (funny) {
            printf("Funny\n");
        }

    }

    return 0;
}