Как рассчитать абсолютную разницу по парам чисел, используя хэш-карту? - PullRequest
2 голосов
/ 31 октября 2019

Я хочу преобразовать целочисленный массив в пары ключ-значение, где каждый элемент является значением предыдущего элемента и ключом к последующему элементу, за исключением первого и последнего элементов.

OnceУ меня есть массив, преобразованный в hashmap, мне нужно рассчитать разрыв между целыми числами в массиве. Я могу преобразовать массив, но ищу более элегантное решение, и мне все еще нужно найти пробел.

public void calculateGap(int[] nums) {
    int l = nums.length;
    Map<Integer, Integer> dist = new HashMap<>();

    for(int i=0; i<l; i++) {
        if(i != l-1) {
            int val = nums[i+1];
            dist.put(nums[i], val);    
        }
        if(i != 0) {
            int key = nums[i-1];
            dist.put(key, nums[i]);
        }
    }
}

Ввод: [3, 6, 9, 1]

Ввод в виде хеш-карты: {3: 6, 6: 9, 9: 1}

Выход: [3, 3, 8]

Ответы [ 4 ]

3 голосов
/ 31 октября 2019

В: Мне интересно, для чего нужен обход хеш-карты, когда можно сразу вычислить расстояние.

public int[] calculateGap(int[] nums) {
    if (nums.length < 2) {
        throw new IllegalArgumentException();
    }

    int[] dist = new int[nums.length - 1];
    for (int i = 1; i < nums.length; i++) {
        dist[i - 1] = Math.abs(nums[i] - nums[i - 1]);
    }
    return dist;
}
3 голосов
/ 31 октября 2019

В: Почему бы не что-то вроде этого:

public static Map<Integer, Integer> calculateGap(int[] nums) {
    Map<Integer, Integer> result = new HashMap<>();
    for(int i=0; i<nums.length - 1; i++) {
          result.put(nums[i], nums[i+1);    
    }
    return result;
}    
...
public static int gap ( Map<Integer, Integer> map, int idx) throws Exception {
  if (idx < 0 || idx >= map.size()) {
     throw new Exception ("index "+ idx " exceeds list bounds 0 .." + map.size() - 1);
  }
  return Math.abs(idx - map.get(idx);
}
1 голос
/ 31 октября 2019

Использование хэш-карты не требуется. Вы можете вообще пропустить его и просто сохранить вычисленные промежутки в int [] или ArrayList:

//using int[]
public int[] calculateGap(int[] nums) {
    int len = nums.length;
    int [] dist = new int[len-1];

    for(int i = 1; i < len; i++) {
        dist[i-1] = Math.abs(nums[i] - nums[i-1]);
    }
}

//using ArrayList
public ArrayList<Integer> calculateGap(int[] nums) {
    int len = nums.length;
    ArrayList<Integer> dist = new ArrayList<Integer>();

    for(int i = 1; i < len; i++) {
        dist.add(Math.abs(nums[i] - num[i-1]));
    }
}

НО Если вы абсолютно хотите использовать Hashmap, это то, как вы можете сделать это в одном цикле:

public static ArrayList<Integer> calculateGap(int[] nums) {
    int l = nums.length;
    HashMap<Integer, Integer> dist = new HashMap<>();
    ArrayList<Integer> gaps = new ArrayList<Integer>();
    int prev = 0;

    for(int i=1; i<l;i++) {
        prev = nums[i-1];
        dist.put(prev, nums[i]);
        gaps.add(Math.abs(dist.get(prev)-prev));
    } 

    return gaps;
}

Или с выходом int []:

public static int[] calculateGap(int[] nums) {
    int l = nums.length;
    Map<Integer, Integer> dist = new HashMap<>();
    int[] gaps = new int[l-1];
    int prev = 0;

    for(int i=1; i<l;i++) {
        prev = nums[i-1];
        dist.put(prev, nums[i]);
        gaps[i-1] = (Math.abs(dist.get(prev)-prev));
    } 

    return gaps;
}

Очевидно, вам не нужно использовать dist.get (prev), поскольку вы можете просто использовать nums [i], но я предполагаю, что по какой-то причине вы хотите использовать Hashmap для получения пробелов.

0 голосов
/ 31 октября 2019

Вы можете сделать это для заполнения HashMap, так как он не требует специальной обработки ребер:

for(int i=1; i<l;i++)
{
    dist.put(nums[i-1], nums[1]);
} 

Но если вы не хотите сохранять его как хэш-карту, вы можете сделатьподвести итоги для dist, сделав второй вызванный массив put и сделав это вместо:

for(int i=2; i < l; i++)
{
    output[i-2] = Math.abs(nums[i]-nums[i-1]);
}

Только одна итерация по массиву, и он вернет тот же результат, что и ваш

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...