有趣的字符串代码
The Funny string code
问题的link是: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开始)的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;
}
这是我的代码
所需的 input/output 是
输入
2
acxz
bcxz
输出
Funny
Not Funny
但是我得到了不同的输出任何人都可以帮助我解决代码的问题并且最差的输出是测试用例值1.I我不明白它是如何给出的该值
你们很亲近。
问题是在使用 scanf
缓冲区输入数字后留下一个 \n
字符,它被解释为字符串的结尾,所以第一个输入是空字符串(不,这不好笑)。在输入字符串之前,您需要清理缓冲区:
scanf("%d",&n);
应该是:
scanf("%d",&n);
while (getchar() != '\n');
现在可以使用了:
2
acxz
bcxz
Funny
Not Funny
当然,在弄清楚这一点之后,听听人们作为对您问题的评论发表的所有建议。并在您的编译器中启用警告。
1) 不需要把所有的输出都存储在一个数组中,以后再打印,可以同时打印,否则可能会超出内存限制,实现也会浪费你的时间
2) 它无法正常工作的原因是因为 scanf 在您的缓冲区中留下了 \n
。您可以通过在 scanf
之后添加它来清除它
char clean;
while (clean=getchar()!='\n' && clean !=EOF);
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");
}
}
}
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;
}
问题的link是: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开始)的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;
}
这是我的代码 所需的 input/output 是
输入
2
acxz
bcxz
输出
Funny
Not Funny
但是我得到了不同的输出任何人都可以帮助我解决代码的问题并且最差的输出是测试用例值1.I我不明白它是如何给出的该值
你们很亲近。
问题是在使用 scanf
缓冲区输入数字后留下一个 \n
字符,它被解释为字符串的结尾,所以第一个输入是空字符串(不,这不好笑)。在输入字符串之前,您需要清理缓冲区:
scanf("%d",&n);
应该是:
scanf("%d",&n);
while (getchar() != '\n');
现在可以使用了:
2
acxz
bcxz
Funny
Not Funny
当然,在弄清楚这一点之后,听听人们作为对您问题的评论发表的所有建议。并在您的编译器中启用警告。
1) 不需要把所有的输出都存储在一个数组中,以后再打印,可以同时打印,否则可能会超出内存限制,实现也会浪费你的时间
2) 它无法正常工作的原因是因为 scanf 在您的缓冲区中留下了 \n
。您可以通过在 scanf
char clean;
while (clean=getchar()!='\n' && clean !=EOF);
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");
}
}
}
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;
}