java - "The Love-Letter Mystery"问题中 hackerrank 的计时问题

标签 java

我正在解决“情书之谜”问题,可能我的逻辑是正确的,但它显示了时间问题问题是 Question here .我的解决方案如下。它包含两个函数,一个是theLoveLetterMystery(String s),它返回 sum_minimum_Steps,另一个是conversionCount(String s,int i,int j) 返回 int characterCount 变量。它将返回值的所有最小步骤相加

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

public class Solution {

    // Complete the theLoveLetterMystery function below.
    static int theLoveLetterMystery(String s) {
        int startCounter=0,endCounter=(s.length()-1),sum_minimum_Steps=0;
        // s.charAt(startCounter)!=s.charAt(endCounter)
        while(startCounter!=endCounter)
        {
            if(s.charAt(startCounter)!=s.charAt(endCounter))
            {
                //minimun steps function executes
                sum_minimum_Steps+=conversionCount(s,startCounter,endCounter);
            }else{
                startCounter++;
                endCounter--;
            }
        }
        return sum_minimum_Steps;
    }
    static int conversionCount(String s,int i,int j) {
        int charStartAscii=(int)s.charAt(i);
        int charEndAscii=(int)s.charAt(j);
        int characterCount=0;
        while(charStartAscii!=charEndAscii)
        {
        charEndAscii--;
        characterCount++;
        }
        return characterCount;
    }    
    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

        int q = scanner.nextInt();
        scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

        for (int qItr = 0; qItr < q; qItr++) {
            String s = scanner.nextLine();

            int result = theLoveLetterMystery(s);

            bufferedWriter.write(String.valueOf(result));
            bufferedWriter.newLine();
        }

        bufferedWriter.close();

        scanner.close();
    }
}

最佳答案

从假设我们正在研究一个由 26 个字母组成的字母表(范围 a - z)开始,“情书之谜”问题是关于找到由字母值减 1 组成的最小运算次数(例如d -> c 并排除字母 a) 将字符串转换为回文字符串。这可以通过添加位于位置 i 和 n - i - 1 的字符之间的绝对 int 差值并迭代超过字符串的一半来获得,其中 n 是字符串的长度。代码如下:

public static int conversionCount(String s) {
    char[] arr = s.toCharArray();
    int length = s.length();

    int count = 0;
    for (int i = 0; i < length / 2; ++i) {
            count += Math.abs((int) (arr[i] - arr[length - i - 1]));
    }
    return count;
}

注意:我在 hackerrank 中测试了它,通过了所有测试。

关于java - "The Love-Letter Mystery"问题中 hackerrank 的计时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60165479/

相关文章:

java - Spring Boot 和 Thymeleaf Neko HTML 错误

java - 无法在浏览器上加载 GWT 应用程序

java - 如何将源代码附加到 Eclipse 中的项目库中?

java - "Multi-level"泛型,带有子类化和接口(interface)

java - 从 Java 应用程序在 hadoop 2.2 (Yarn) 上启动 mapreduce 作业

java - IntelliJ 禁用自动分行

Java编译器已完成但未创建可执行文件?

java - 如何在 Java 中使用必应搜索 API

java - StampedLock 类的 tryOptimisticRead() 方法到底是如何工作的?

java - android,使用 getApplicationContext() 的自定义类