Tag: 算法

用于压缩(例如LZW)字符串的Java库

Apache Commons Compress仅适用于存档文件(如果我错了,请纠正我)。 我需要类似的东西 MyDB.put(LibIAmLookingFor.compress(“My long string to store”)); String getBack = LibIAmLookingFor.decompress(MyDB.get())); 而LZW只是一个例子,可能是类似的。 谢谢。

根据步行速度在2个GPS位置之间插值

问题: 鉴于两个位置: L 1 =(纬度1 ,经度1 ,时间戳1 ) , L 2 =(纬度2 ,经度2 ,时间戳2 ) , 以及可配置但恒定的移动速度: v =每秒1.39米 (例如)。 我们如何在这两个位置之间进行插值以估算用户从L 1到L 2的位置 ? 我一直在寻找这个问题的解决方案,到目前为止我发现,对于小距离(远离极点),可以使用线性插值。 所以,我在维基百科上查找了线性插值 ,发现了这个: // Imprecise method which does not guarantee v = v1 when t = 1, // due to floating-point arithmetic error. float lerp(float v0, float v1, float t) { […]

置换一个字符串

给定String,打印其所有排列。 为此,我提出了以下计划。 public static char[] swap(char[] input, int i, int j) { char temp; temp = input[i]; input[i] = input[j]; input[j] = temp; return input; } /** * * @param args */ public static void permuteStrings(char[] inputString, int start, int finish ) { //Base case: When there is only single element, print the string if(start […]

生成一系列数字的所有排列序列

给出了以下算法,我们应该在java中编写它。 但是,当我尝试逐行理解时,它会让人感到困惑,尤其是部分: A [k + 1:N-1] = S中的值按升序排列 据我所知,该套装在任何时候只有1个号码。 当集合只有1个数时,我们如何替换A[k+1:N-1] ? 令A为升序0到N-1的整数序列(假设它是int[N]的数组)。 next_permutation(A): k = N-1 S = { } while k >= 0: if S contains a value larger than A[k]: v = the smallest member of S that is larger than A[k] remove v from S insert A[k] in S A[k] = v […]

n个数字排成一个圆圈。 我们需要找到连续nos的最大总和

对于线性arrays,找到连续nos的最大总和的问题。 简单。 可以通过使用Kadane的Algo轻松完成。 。 但是现在arrays是圆形的,我们需要找到连续nos的最大总和。 因此startindex和endindex可以在数组中的任何位置。 我没有得到如何在O(n)时间内解决它。 例如: { 8, 9, -14, 4, 3} 。 最大子arrayssum= 4+3+8+9= 24. startindex=3 and endindex=1 (零索引数组)。 请给我一些关于如何处理这个问题的提示或算法。 无需代码。 编辑:正如大家所提到的,圆形数组类似于跨越两次的相同数组。 但是如何在该arrays上应用Kadane的Algo并限制连续的nos。 到<= n

从给定长度生成所有可能的字符串

我希望能够从给定的长度生成所有可能的字符串,坦白说,我不知道如何编码。 因此,为了进一步解释,我和一位朋友想展示一些基本的黑客攻击技术,因此会出现强制攻击。 当然,他将是我的受害者,那里没有违法的东西。 然而,他告诉我的唯一一件事是他的PW将是4个字符长,但我很确定他的PW不会出现在任何字典中,这很容易。 所以我提出了生成每个4-char-long-string的想法,包含az字符(无上限)。 是否有人可以跟随代码编写这样的算法? 我真的不打扰表演,如果需要1晚才能生成所有PW,那没问题。 别忘了,这只是出于演示目的。

如何创建不均匀的范围数随机函数?

我们知道经典范围随机函数是这样的: public static final int random(final int min, final int max) { Random rand = new Random(); return min + rand.nextInt(max – min + 1); // +1 for including the max } 我想创建算法函数,用于在1..10之间的范围内随机生成数字,但是具有不均匀的可能性,例如: 1)1,2,3 – > 3/6(1/2) 2)4,5,6,7 – > 1/6 3)8,9,10 – > 2/6(1/3) 以上意味着该函数有1/2的机会返回1到3之间的数字,1/6的机会返回4到7之间的数字,以及1/3的机会返回8到10之间的数字。 谁知道算法? 更新: 实际上,1..10之间的范围仅作为示例。 我想要创建的函数适用于任何数字范围,例如:1..10000,但规则仍然相同:顶部范围为3/6(30%部分),中间范围为1/6(下一个) 40%部分),底部范围2/6(最后30%部分)。

如何在BFS中遍历时存储每个节点的级别?

如果我们有二叉树: 7 / \ 5 6 /\ /\ 2 3 1 4 / 5 如何打印以下输出? [7], [5,6] [2,3,1,4] [5] 意味着做一个BFS并在列表中的每个级别存储节点,然后打印列表? 我能够在BFS中遍历,但我无法在树中找到每个元素的正确级别。 如何找到每个节点的正确级别并使用其级别值丰富节点对象? 这是我的逻辑: 遍历BFS 使用其级别值丰富树的每个节点 将节点存储在列表中 遍历列表并创建<Level,List>的Map 将节点级别存储在Set ,然后转换为列表并对其进行排序。 迭代新创建的级别列表,并从地图中找到该列表上的相应节点并打印它

mergeSort实现,用于查找尝试从文件读取时无效的反转次数

我试图做一个mergesort实现来查找反转次数。 。 该数组似乎返回了一个硬编码的小数字列表的正确结果,但是当我从文件中读取时返回的数字不正确。 我猜它与字符串整数比较有关,但无法弄清楚究竟是什么问题,。 任何见解都会有所帮助。这是(相关)代码 – public class ReadFile { public static void main(String args[]){ int count=0; int n[]; int i=0; try{ n=OpenFile(); int num[] = new int[n.length]; for (i=0;i<n.length;i++){ num[i]=n[i]; // System.out.println( "Num"+num[i]); } count=countInversions(num); } catch(IOException e){ e.printStackTrace(); } System.out.println(" The number of inversions"+count); } public static int [] OpenFile()throws IOException{ FileReader fr=new […]

找到由其他单词构成的最长单词

我正在研究一个问题,即编写一个程序来查找单词列表中由其他单词组成的最长单词。 EXAMPLE Input: test, tester, testertest, testing, testingtester Output: testingtester 我搜索并找到以下解决方案,我的问题是我在第2步中感到困惑,为什么我们应该以各种可能的方式打破每个单词? 为什么不直接使用每个单词呢? 如果有人能提供一些见解,那就太好了。 以下解决方案执行以下操作: 按大小对数组进行排序,将最长的单词放在前面 对于每个单词,请以所有可能的方式将其拆分。 也就是说,对于“test”,将其分为{“t”,“est”},{“te”,“st”}和{“tes”,“t”}。 然后,对于每个配对,检查前半部分和第二部分是否都存在于arrays中的其他位置。 通过返回我们发现符合条件#3的第一个字符串来“短路”。