问题的链接是: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.我没有得到它如何给出该值
答案 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", ×);
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;
}