lintcode-medium-Nuts & Bolts Problem
Posted 哥布林工程师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lintcode-medium-Nuts & Bolts Problem相关的知识,希望对你有一定的参考价值。
Given a set of n nuts of different sizes and n bolts of different sizes. There is a one-one mapping between nuts and bolts. Comparison of a nut to another nut or a bolt to another bolt is not allowed. It means nut can only be compared with bolt and bolt can only be compared with nut to see which one is bigger/smaller.
We will give you a compare function to compare nut with bolt.
Given nuts = [‘ab‘,‘bc‘,‘dd‘,‘gg‘]
, bolts = [‘AB‘,‘GG‘, ‘DD‘, ‘BC‘]
.
Your code should find the matching bolts and nuts.
one of the possible return:
nuts = [‘ab‘,‘bc‘,‘dd‘,‘gg‘]
, bolts = [‘AB‘,‘BC‘,‘DD‘,‘GG‘]
.
we will tell you the match compare function. If we give you another compare function.
the possible return is the following:
nuts = [‘ab‘,‘bc‘,‘dd‘,‘gg‘]
, bolts = [‘BC‘,‘AA‘,‘DD‘,‘GG‘]
.
So you must use the compare function that we give to do the sorting.
The order of the nuts or bolts does not matter. You just need to find the matching bolt for each nut.
/** * public class NBCompare { * public int cmp(String a, String b); * } * You can use compare.cmp(a, b) to compare nuts "a" and bolts "b", * if "a" is bigger than "b", it will return 1, else if they are equal, * it will return 0, else if "a" is smaller than "b", it will return -1. * When "a" is not a nut or "b" is not a bolt, it will return 2, which is not valid. */ public class Solution { /** * @param nuts: an array of integers * @param bolts: an array of integers * @param compare: a instance of Comparator * @return: nothing */ public void sortNutsAndBolts(String[] nuts, String[] bolts, NBComparator compare) { // write your code here if(nuts == null || nuts.length == 0 || bolts == null || bolts.length == 0 || nuts.length != bolts.length) return; sort(nuts, bolts, 0, nuts.length - 1, compare); return; } public void sort(String[] nuts, String[] bolts, int start, int end, NBComparator compare){ if(start >= end) return; int partition = partition(nuts, bolts[end], start, end, compare); partition(bolts, nuts[partition], start, end, compare); sort(nuts, bolts, start, partition - 1, compare); sort(nuts, bolts, partition + 1, end, compare); return; } public int partition(String[] array, String pivot, int start, int end, NBComparator compare){ if(start >= end) return start; int left = start; int right = end; String pivot_mirror = null; for(int i = start; i <= end; i++) if(compare.cmp(array[i], pivot) == 0 || compare.cmp(pivot, array[i]) == 0){ pivot_mirror = array[i]; break; } while(true){ while(left < right && ((compare.cmp(array[left], pivot) == -1) || (compare.cmp(pivot, array[left]) == 1))) left++; while(left < right && ((compare.cmp(array[right], pivot) == 1) || compare.cmp(pivot, array[right]) == -1)) right--; if(left == right) break; swap(array, left, right); } array[left] = pivot_mirror; return left; } public void swap(String[] array, int i, int j){ String temp = array[i]; array[i] = array[j]; array[j] = temp; return; } };
以上是关于lintcode-medium-Nuts & Bolts Problem的主要内容,如果未能解决你的问题,请参考以下文章
要求的参考折叠规则的简明解释:(1) A& & -> A& , (2) A& && -> & , (3) && &a
Java String 将 '&' 替换为 & 而不是 & 到 &