我有一个java问题,我不知道如何解决该程序:
必须从用户n,k获得两个号码。
我需要找到从1到N的数字的排列,以便两个项之间的差异> = k例如:
我们得到数字(n = 5和k = 2)
,答案必须是1,4,2,5,3:
并且对于(n = 2和k = 2)没有答案,因为1和2之间的差异是1(1,2或2,1)。
我希望你明白我的意思。
我写了一些错误的代码:
public static void main(String[] args) {
Scanner user_input = new Scanner(System.in);
int n = user_input.nextInt();
int k = user_input.nextInt();
int a ;
if (n%2==0) a = (n-2)/2; else a = (n-1)/2 ;
if (k!=a) {System.out.println("Impossible"); return;}
int h = k+1;
int value = 0;
int t = 1;
boolean b = true;
String res = "1 ";
while (value<n-1) {
value++;
if (b){
t = t + h;
res = res + t + " ";
b = false;
}else {
t = t-k;
res = res + t + " ";
b = true;
}
}
System.out.println(res);
}
答案 0 :(得分:1)
这是代码
public class HelloWorld{
public static void calculationMethod(int n, int k) {
if(n<2 || n/2 < k) {
System.out.println("Impossible");
return;
}
else {
int i = (int)Math.ceil(n/2.0);
int j = n;
int start = i;
boolean flag = true;
while(i>=1 || j>start) {
if(flag) {
System.out.print(i + " " );
i--;
flag = false;
}
else {
System.out.print(j + " " );
j--;
flag = true;
}
}
}
}
public static void main(String []args){
calculationMethod(7,3);
}
}
这个想法是将你的范围(n)分成两半。如果k> n / 2则则不可能构建任何这样的序列。
如果不是这种情况,那么在你的范围中间有一个指针,一个指针在范围的末尾。并打印它们或者递减两个指针,直到你到达开头。
随意改进代码。
答案 1 :(得分:0)
public void calculationMethod(int n, int k) {
ArrayList<Integer> intList = new ArrayList<>();
for (int i = 1; i <= n; i++) {
int a = i;
int b = i + 2;
if (!intList.contains(a) && a<=n) {
intList.add(a);
}
if (!intList.contains(b) && b<=n) {
intList.add(b);
}
}
String mValues= TextUtils.join(",",intList);
Log.i("values", mValues);
}