2017-01-05 2 views
0

У меня есть проблема Java, что я не знаю, как решить эту программу является:Расставьте числа путем вычитания

два числа должны получили от пользователя п, к.

мне нужно найти permuation чисел от 1 до N, так что разность между двумя элементами> = K, например:

мы получаем число (п = 5 и к = 2)

и ответ должен быть 1,4,2,5,3:

и для (n = 2 и k = 2) ответа нет, потому что разница между 1 и двумя составляет 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

Это домашнее задание? – xxlali

+0

@xxlali почему? Его легко ?? –

+2

На самом деле определение вашей задачи непонятно. Что такое «порядок числа»? Как насчет n? Почему нет ответа для n = 2, k = 2? – RealSkeptic

ответ

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); 
    } 
} 

Идея заключается в том, чтобы разделить диапазон (п) пополам. Если k> n/2, то никакой такой последовательности невозможно построить.

Если это не так, то у вас есть 2 указателя один в середине вашего диапазона и один в конце диапазона. и печатайте их, иначе уменьшая оба указателя, пока вы не достигнете начала.

Не стесняйтесь совершенствовать код.

+0

ваш код был полностью прав спасибо большое за ваш ответ. Ваше решение было потрясающим. –

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); 
} 
+0

Не просмотрите свое решение, если не работает, но в любом случае вы действительно хотите написать объяснение своего кода. Проблема не тривиальная, поэтому очень важно понять, почему работает алгоритм. Не будет отвечать на ответ, даже если он будет правильным, если он пропустит такое объяснение. – Aziuth

+0

@Aziuth спасибо :) – varghesekutty

Смежные вопросы