我正在尝试使用两种方法编写程序,以确定子数组是否位于数组中。 subArray()应该接收两个数组并返回数组中子数组的起始索引。如果子数组不在数组中,则返回-1。然后subArray()调用subArrayAppearsAt()并传入两个数组和一个位置。如果子数组位于从传入的位置开始的数组中,则subArrayAppearsAt()应返回true,否则返回false。 目前,如果我传入数组{1,2,3}和子数组{2,3},它返回2作为起始位置,但它应返回1。 如果我传入数组{1,2,3,4,5}和子数组{4},它返回-1,但它应返回3。 有谁知道为什么会发生这种情况?
public static int subArray(int [ ] array, int [ ] subArray )
{
boolean result=true;
int subArrayLength = subArray.length;
if (subArrayLength == 0) {
return -1;
}
int limit = array.length - subArrayLength;
int i;
for ( i = 0; i <= limit; i++)
result = subArrayAppearsAt(array, subArray, i );
if (result==true)
return i;
else
return -1;
}
public static boolean subArrayAppearsAt(int[] largeArray, int[] subArray, int i) {
{
if (subArray[0] == largeArray[i])
{
boolean subArrayFound = true;
for (int j = 1; j < subArray.length; j++)
{
if (subArray[j] != largeArray[i+j])
{
subArrayFound = false;
j=subArray.length;
}
/* Sub array found - return its index */
if (subArrayFound==true)
{
return true;
}
}
}
}
/* Return default value */
return false;
}
答案 0 :(得分:0)
问题是,如果你想知道起始位置,你应该把 if 检查结果在de 循环中
public static int subArray(int [ ] array, int [ ] subArray )
{
boolean result=true;
int subArrayLength = subArray.length;
if (subArrayLength == 0) {
return -1;
}
int limit = array.length - subArrayLength;
int i;
for ( i = 0; i <= limit; i++){
result = subArrayAppearsAt(array, subArray, i );
if (result==true)
return i;
}
return -1;
}
答案 1 :(得分:0)
看看这部分
for ( i = 0; i <= limit; i++)
result = subArrayAppearsAt(array, subArray, i );
每次进入循环时都会设置结果。如果您在{4}
中测试{1, 2, 3, 4, 5}
是否被包含,则会将result
设置为subArrayAppearsAt(array, subArray, 4);
的返回值,这将返回false
因此,对于这个问题,您可以执行类似
的操作for ( i = 0; i <= limit; i++) {
result = subArrayAppearsAt(array, subArray, i );
if (result==true)
return i;
}
return -1;
另一个问题是,i
在最后一次进入for循环后会递增,然后返回该值。我的代码解决方案也应该解决这个问题。
我没有测试我的解决方案,但它应该工作;)
修改强>
抱歉这不完全正确。您的subArrayAppearsAt()
太早返回true。编辑您的subArrayAppearsAt()
功能,它应该可以正常工作
public static boolean subArrayAppearsAt(int[] largeArray, int[] subArray, int i)
{
if (subArray[0] == largeArray[i])
{
for (int j = 1; j < subArray.length; j++)
{
if (subArray[j] != largeArray[i+j])
{
return false;
}
}
return true;
}
return false;
}
答案 2 :(得分:0)
public static void main(String[] args) {
int[] first = {1,2,4,5,3,2,1,3,4,5,6,33,432,21,5};
int[] second = {2,1};
System.out.println(findpos(first, second));
}
private static int findpos(int[] a, int[] b){
for(int i=0; i<a.length; i++){
if(a[i]!=b[0]){
continue;
}
if(a.length - i < b.length) return -1;
int itemp = i;
boolean found = true;
for(int j=0; j<b.length; j++){
if(itemp < a.length && a[itemp]!=b[j]){
found = false;
}
itemp++;
}
if(found){
return i;
}
}
return -1;
}