这更像是一个自定义的编程练习,而不是一个真正的问题。我有一组java.lang.Comparable
个项目。我需要维护两个指针(数组的索引,即int值)i,j。我从数组的开头开始向右移动,直到它遇到一个小于或等于前一个元素的元素。当它这样做时它停止向右移动并最终指向不正常的元素(元素不大于前一个元素)。类似地,j从数组的末尾开始并向左移动,直到找到一个不小于前一个元素的元素。
另外,我需要确保索引不会耗尽数组,即我不能低于0而j不能高于arraylength-1
假设我们有一个包含5个元素的数组。
i = 0;
j = 4;(which is the arraylength-1 )
if C,D,E,F,G is the array ,the final values of i and j will be
i = 4 and j = 0
if array is J,D,E,F,G ,the final values of i, j will be
i = 0 , j = 0
if array is B,C,A,D,G , final values of i,j will be
i = 2 , j = 1
我尝试将逻辑for moving i to the right, using a while loop
编码如下。在两种情况下,我能够让它为i指针工作。
public class PointerMovement{
public static void ptrsPointToOutOfOrderElements(Comparable[] a){
int lo = 0;
int hi = a.length-1;
int i = lo;
int t=i+1;
int j = hi;
//only for moving i to the right .
while(less(a[i],a[t])){
if(t == hi){
i=t;
break;
}
i++;
t++;
}
i=t;
for(Comparable x:a){
System.out.print(x+",");
}
System.out.println();
System.out.println("bad element or end of array at i="+i+"==>"+a[i]);
}
private static boolean less(Comparable x,Comparable y){
return x.compareTo(y) < 0;
}
public static void main(String[] args) {
String[] a = new String[]{"C","D","E","F","G"};//works
//String[] a = new String[]{"B","C","A","D","G"};//works
//String[] a = new String[]{"J","D","E","F","G"};//fails!
ptrsPointToOutOfOrderElements(a);
}
}
我的推理理由如下:
我维护i=0;
和另一个变量t=i+1
当while循环失败时,less(a[i],a[t])
为false。我们需要返回指向[t]的指针,该指针无序。所以我= t并返回i。
如果我们到达数组的右端,测试if(t == hi)通过,我们指定i = t,现在i指向数组的结尾。
但是,当乱序元素位于数组中的第0个位置时,代码会失败。
Ĵ,d,E,F,G
而不是i(= 0)我们得到i = 1,因为i = t是assgined.i最终指向D而不是J.
有人能指出我正确的方向吗?
更新
这似乎有用
public static void ptrsPointToOutOfOrderElements(Comparable[] a){
int lo = 0;
int hi = a.length-1;
int i = lo;
while(less(a[i],a[i+1])){
if(i+1 == hi){
break;
}
i++;
}
i++;
int j = hi;
while(less(a[j-1],a[j])){
if(j-1 == lo){
break;
}
j--;
}
j--;
for(Comparable x:a){
System.out.print(x+",");
}
System.out.println();
if(i>=j){
System.out.println("pointers crossed");
}
System.out.println("bad element or end of array at i="+i+"==>"+a[i]);
System.out.println("bad element or end of array at j="+j+"==>"+a[j]);
}
答案 0 :(得分:1)
我认为你没有问题: String [] a = new String [] {“C”,“D”,“E”,“F”,“G”}; //有效,索引应为4(但应该是这样吗?它表示G是不按规定的。我认为你应该返回5,表示没有任何故障。 String [] a = new String [] {“B”,“C”,“A”,“D”,“G”}; //有效,索引应为2,因为A无序 String [] a = new String [] {“J”,“D”,“E”,“F”,“G”}; //因为第一个乱序元素确实是D,索引1
答案 1 :(得分:0)
我尝试过使用简单的 for 循环。
Error: Problem with `mutate()` column `cat`.
i `cat = ifelse(...)`.
x argument "random_3" is missing, with no default
Run `rlang::last_error()` to see where the error occurred.
In addition: Warning message:
Error: Problem with `mutate()` column `cat`.
i `cat = ifelse(...)`.
x argument "random_3" is missing, with no default
Run `rlang::last_error()` to see where the error occurred.