Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么是我的变量';额外';已修改,而我正在更改其副本。(特定查询,而不是一般查询)_Java_Arrays_String_Algorithm_Variables - Fatal编程技术网

Java 为什么是我的变量';额外';已修改,而我正在更改其副本。(特定查询,而不是一般查询)

Java 为什么是我的变量';额外';已修改,而我正在更改其副本。(特定查询,而不是一般查询),java,arrays,string,algorithm,variables,Java,Arrays,String,Algorithm,Variables,我正在努力解决HackerRank中的熊和稳定基因问题。 我有一个名为extra的int数组变量,我在extra_temp中复制它,并在这个新变量中进行所有修改,但不知何故,原始变量“extra”被修改了。我知道这很奇怪,但老实说,我花了几个小时来理解为什么会发生这种情况,但我找不到原因。这是我的密码 public static int subFinder(int[] extra, char[] S, int N) { List<Integer> opt=n

我正在努力解决HackerRank中的熊和稳定基因问题。 我有一个名为extra的int数组变量,我在extra_temp中复制它,并在这个新变量中进行所有修改,但不知何故,原始变量“extra”被修改了。我知道这很奇怪,但老实说,我花了几个小时来理解为什么会发生这种情况,但我找不到原因。这是我的密码

    public static int subFinder(int[] extra, char[] S, int N)
    {

    List<Integer> opt=new ArrayList<Integer>();
    int start=0;
    int end=0;
    int r=1;
    int[] extra_tmp=new int[4];
    for (int i=0;i<N;i++)
    {
        extra_tmp=extra;
        //System.out.println(extra[0]);
        //System.out.println("");
        System.out.println(extra[1]);
        //System.out.println("");
        //System.out.println(extra[2]);
        //System.out.println("");
        //System.out.println(extra[3]);
        //System.out.println("Hello");
        int count=0;

        if(extra_tmp[S[i]-97]>0)
        {
            start=i;
            extra_tmp[S[i]-97]--;
            for(int j=i+1;j<N;j++)
            {  
                if(extra_tmp[S[j]-97]>0)
                {
                    extra_tmp[S[j]-97]--;
                    end=j;
                }
            }

                System.out.println("Hello");
                    opt.add(end-start+1);
                    i=i+2;
        }
    }
    System.out.println(opt.size());
    Collections.sort(opt);
    r=opt.get(0);
    return r; 
} 
公共静态int子索引(int[]extra,char[]S,int N)
{
List opt=new ArrayList();
int start=0;
int end=0;
int r=1;
int[]extra_tmp=新int[4];
对于(int i=0;i0)
{
开始=i;
额外的tmp[S[i]-97]-;
对于(int j=i+1;j0)
{
额外的tmp[S[j]-97]-;
end=j;
}
}
System.out.println(“你好”);
选择添加(结束-开始+1);
i=i+2;
}
}
System.out.println(opt.size());
集合。排序(opt);
r=opt.get(0);
返回r;
} 
我得到以下输出 3. 你好 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1. 十,

这里3是额外[1]的初始值。我做错了什么

剩下的代码在这里

    public static void main(String[] args)
{
    Scanner in=new Scanner(System.in);
    int N=in.nextInt();
    //System.out.println(N);

    in.nextLine();
    String s=in.nextLine();
    char[] S=new char[N];
    S=s.toCharArray();
    for (int i=0;i<N;i++)
    {
        if (S[i]=='A')
            S[i]='a';
        else if (S[i]=='C')
            S[i]='b';
            else if (S[i]=='G')
            S[i]='c';
            else if(S[i]=='T')
            S[i]='d';
    }
    //System.out.println(S[0]);
    HashMap<Character,Integer> hm=new HashMap<Character,Integer>();

    hm.put('a',0);
    hm.put('b',0);
    hm.put('c',0);
    hm.put('d',0);

    for(int i=0;i<N;i++)
    {
        hm.put(S[i],hm.get(S[i])+1);
    }
    //System.out.println(hm.get('A'));
    int[] count=new int[4];

    count[0]=hm.get('a');
    count[1]=hm.get('b');
    count[2]=hm.get('c');
    count[3]=hm.get('d');

    //System.out.println(count[0]);

    int[] extra=new int[4];
    for (int j=0;j<4;j++)
    {          
        if (count[j]>N/4)
        {
            extra[j]=count[j]-N/4;
            //System.out.println(extra[j]);
        }  
        else
            extra[j]=0;

    }
    for (int j=0;j<4;j++)
    {    
        System.out.println(extra[j]);
    }
    //for (int l=0;l<4;l++)
    //System.out.println(extra[l]);
    int r=subFinder(extra,S,N);
    System.out.println(r);
}
publicstaticvoidmain(字符串[]args)
{
扫描仪输入=新扫描仪(系统输入);
int N=in.nextInt();
//系统输出println(N);
in.nextLine();
字符串s=in.nextLine();
char[]S=新字符[N];
S=S.toCharArray();

对于(int i=0;i这不会复制数组。它只复制一个引用

    extra_tmp = extra;
extra\u tmp
extra
都指向内存中的同一位置,因此如果修改
extra\u tmp[i]
,则
extra[i]
也将被修改

下面是复制阵列的简单方法:

    extra_tmp = extra.clone();

这不会复制数组。它只复制引用

    extra_tmp = extra;
extra\u tmp
extra
都指向内存中的同一位置,因此如果修改
extra\u tmp[i]
,则
extra[i]
也将被修改

下面是复制阵列的简单方法:

    extra_tmp = extra.clone();

当你声明一个数组时,会给它一个引用。这个引用持有数组的头

int[] array1 = new int[4];
int[] array2 = new int[4];

for(int i = 0; i<4; i++)
    array1[i] = i+1;

array2 = array1;
int[]array1=新的int[4];
int[]array2=新int[4];

对于(inti=0;i,当您声明一个数组时,会给它一个引用。该引用保存数组的头

int[] array1 = new int[4];
int[] array2 = new int[4];

for(int i = 0; i<4; i++)
    array1[i] = i+1;

array2 = array1;
int[]array1=新的int[4];
int[]array2=新int[4];
对于(int i=0;i