牛客网 2018校招真题 盛大游戏 找出最接近的对称数字

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32767041/article/details/86501034

Description

牛客网 2018校招真题 找出最接近的对称数字

Solving Ideas

为了使对称数字最接近,应该尽量保持高位不变,然后修改低位数字从而达到对称。

  • 当输入数字已经对称时,选择修改中心的数字,这样能保证更高位不变,从而达到最近的目的,另外需要注意中心数字是否大于0的情况
    如:202变为212而不是191,343变为333而不是353(虽然两者到343的距离一样,但题目要求取小的作为答案)
  • 当输入数字不对称时,直接修改中心往右的低位数字使之对称即可

Time complexity : O ( n ) O(n)
Space complexity : O ( 1 ) O(1)

Solution

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author wylu
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] str = br.readLine().toCharArray();
        int n = str.length;

        if (isPalindrome(str)) {
            int mid = n / 2;
            if (str[mid] > 0) str[mid] = (char) (str[mid] - 1);
            else str[mid] = (char) (str[mid] + 1);
            if (n % 2 == 0) str[mid - 1] = str[mid];
        } else {
            for (int i = (n + 1) / 2, j = (n % 2 == 0) ? 1 : 2; i < n; i++, j += 2) {
                str[i] = str[i - j];
            }
        }

        System.out.println(new String(str));
    }

    private static boolean isPalindrome(char[] str) {
        for (int i = 0, j = str.length - 1; i < j; i++, j--) {
            if (str[i] != str[j]) return false;
        }
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_32767041/article/details/86501034
今日推荐