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

检查两个数组是否为循环排列

如何解决检查两个数组是否为循环排列

| 给定两个数组,如何检查一个数组是否为另一个的循环排列? 例如,给定
a = [1,2,3,1,5]
,ѭ1and和
c = [2,5]
,我们得出ѭ3have和
b
是循环置换,而not5ѭ不是这两个的循环置换。 注意:数组可能具有重复的元素。     

解决方法

这里的标准技巧是将一个数组与其自身连接起来,然后尝试在连接的数组中找到第二个数组。 例如,与自身串联的\'a \'是: [1、2、3、1、5、1、2、3、1、5] 因为您确实从第3个元素开始在此数组中看到\'b \',所以a和b是循环排列。     ,如果A和B是彼此的循环排列,则A将在双列列表BB中找到(就像A在A中一样)。     ,处理大量数据的有效方法是将每个数据转换为“规范”形式,然后进行比较以查看它们是否相等。对于此问题,您可以选择“最小排序”作为所有旋转排列的规范形式。 因此,\'a \'和\'b \'的规范形式为[1、2、3、1、5],它们相等,因此它们是非循环排列。 \'c \'的规范形式为[1、3、1、5、2],这是不同的。     ,这是一种简单的即席方法,可发现时间复杂度为O(n)的循环置换。 a = [1、2、3、1、5],b = [3、1、5、1、2] 在a []中找到b [0]的索引,假设索引为\'x \'。然后开始     在两个阵列中导航。 a []从索引\'x \'和b []开始     从\'0 \'开始。这样它们两个必须具有相同的值。如果     不是,它们不是周期性的。      这是示例代码。
 public class CyclicPermutation {

    static char[] arr = { \'A\',\'B\',\'C\',\'D\' };
    static char[] brr = { \'C\',\'D\',\'K\',\'B\' };
    boolean dec = false;

    public static void main(String[] args) {
        boolean avail = true;
        int val = getFirstElementIndex(brr[0]);
        if(val ==Integer.MIN_VALUE){
            avail = false; 
            return;
            }

        for (int i = val,j = 0; j <= brr.length-1; ) {
            if (i > arr.length-1) {
                i = 0;
            }
            if (arr[i] == brr[j]) {
                i++;

                j++;

            } else {
                avail = false;
                System.out.println(avail);
                return;
            }


        }

   System.out.println(avail);
    }

    public static int getFirstElementIndex(char c) {

        for (int i = 0; i <= arr.length; i++) {
            if (arr[i] == c) {
                return i;
            }
        }
        return Integer.MIN_VALUE;
    }


}
    

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