微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将这段代码从 C# 转换为 Java,在 Java 中还有什么可以简化的吗?

如何解决将这段代码从 C# 转换为 Java,在 Java 中还有什么可以简化的吗?

这是一个函数,给定一个由 N 个整数组成的数组 A,其中 A[K] 表示第 K 棵树的高度,返回切出一棵树的方法数,这样剩下的树是美观。如果无法达到预期的结果,该函数应返回 -1。如果它在没有任何删除的情况下已经美观,则该函数应返回 0。

这是用C#编写的代码

using System;

namespace activity_problem
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("");
        }
    }

    class Solution
    {
        public int solution(int[] a)
        {
            if (iSAEsthetic(a))
            {
                return 0;
            }

            int aestheticPatternCount = 0;
            for (int j = 0; j < a.Length; j++)
            {
                int[] newA = copyArrayWithoutAnElement(a,j);
                if (iSAEsthetic(newA))
                {
                    aestheticPatternCount++;
                }
            }

            if (aestheticPatternCount == 0)
            {
                return -1;
            }
            else
            {
                return aestheticPatternCount;
            }
        }

        private int[] copyArrayWithoutAnElement(int[] array,int indexOfElementToBeRemoved)
        {
            int arrayLength = array.Length;
            int[] newArr = new int[arrayLength - 1];
            int tempK = 0;
            for (int k = 0; k < arrayLength; k++)
            {
                if (k != indexOfElementToBeRemoved)
                {
                    newArr[tempK++] = array[k];
                }
            }
            return newArr;
        }

        private Boolean iSAEsthetic(int[] array)
        {
            int newArrayLength = array.Length;
            int increasingFlag = 0;
            for (int i = 0; i < newArrayLength; i++)
            {
                if (increasingFlag == 0)
                {
                    if (array[i] < array[i + 1])
                    {
                        increasingFlag = 1;
                    }
                    else
                    {
                        increasingFlag = 2;
                    }
                }
                else
                {
                    if (increasingFlag == 1)
                    {
                        if (i % 2 == 1 && array[i] > array[i - 1])
                        {

                        }
                        else if (i % 2 == 0 && array[i] < array[i - 1])
                        {

                        }
                        else
                        {
                            return false;
                        }
                    }
                    else
                    {
                        if (i % 2 == 1 && array[i] < array[i - 1])
                        {

                        }
                        else if (i % 2 == 0 && array[i] > array[i - 1])
                        {

                        }
                        else
                        {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
    }
}

转换成JAVA,还有什么可以简化的吗?

public class Main {

    public static void main(String[] args) {

            Solution sol = new Solution();
            int solution = sol.solution(new int[]{1,2,3,4,5});
            System.out.println(solution);
        }

        public static class Solution {
            public int solution(int[] a){
                if (iSAEsthetic(a))
                {
                    return 0;
                }
                int aestheticPatternCount = 0;
                for (int j = 0; j < a.length; j++)
                {
                    int[] newA = copyArrayWithoutAnElement(a,j);
                    if (iSAEsthetic(newA))
                    {
                        aestheticPatternCount++;
                    }
                }
                if (aestheticPatternCount == 0)
                {
                    return -1;
                }
                else
                {
                    return aestheticPatternCount;
                }
            }
            private int[] copyArrayWithoutAnElement(int[] array,int indexOfElementToBeRemoved)
            {
                int arrayLength = array.length;
                int[] newArr = new int[arrayLength - 1];
                int tempK = 0;
                for (int k = 0; k < arrayLength; k++)
                {
                    if (k != indexOfElementToBeRemoved)
                    {
                        newArr[tempK++] = array[k];
                    }
                }
                return newArr;
            }
            private Boolean iSAEsthetic(int[] array)
            {
                int newArrayLength = array.length;
                int increasingFlag = 0;
                for (int i = 0; i < newArrayLength; i++)
                {
                    if (increasingFlag == 0)
                    {
                        if (array[i] < array[i + 1])
                        {
                            increasingFlag = 1;
                        }
                        else
                        {
                            increasingFlag = 2;
                        }
                    }
                    else
                    {
                        if (increasingFlag == 1)
                        {
                            if (i % 2 == 1 && array[i] > array[i - 1])
                            {
                            }
                            else if (i % 2 == 0 && array[i] < array[i - 1])
                            {
                            }
                            else
                            {
                                return false;
                            }
                        }
                        else
                        {
                            if (i % 2 == 1 && array[i] < array[i - 1])
                            {
                            }
                            else if (i % 2 == 0 && array[i] > array[i - 1])
                            {
                            }
                            else
                            {
                                return false;
                            }
                        }
                    }
                }
                return true;
            }
        }
    }

我目前正在尝试用 Java 学习算法,因此非常感谢任何帮助或输入。

解决方法

为了可读性:

为了简化代码,您可以做的一件事是删除空的 else-if 分支。

另一种方法是遵循通常的 java conventions 并将花括号放在同一行上,例如:

if (something) {
    // ...
} else if (somethingElse) {
    // ...
} else {
    // ...
}

对于实际的程序逻辑:

您可以使用 Collections api 来简化其中的某些部分,而不是完全按照编写的方式移植代码。例如,如果您需要一个数组(而不是某种列表),那么您可以使用集合(例如ArrayList)完成删除元素等所有工作并将其转换为最后是一个数组。

此外,正如评论中所指出的,有很多比较正在进行中。如果您可以简化它并减少比较,您将拥有更好的算法。

我建议从一些带有案例的单元测试开始,以验证旧代码和新代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。