JavaScript 查询给定字符串的旋转和第K个字符,在常数时间内
给定字符串的旋转意味着以某些索引的顺时针或逆时针方式移动给定字符串的字符。在这里,我们将实现一个JavaScript程序,在常数时间内查询给定字符串的旋转和第K个字符。在本文中,我们将实现正确的代码并解释每个步骤。
问题介绍
在给定的问题中,我们被给予一个包含一些字符的字符串。我们被给予一些有限的查询,每个查询包含两个数字或整数。第一个整数表示我们必须旋转字符串的次数(在这个问题中,我们只是将字符串顺时针旋转或向右旋转字符串),而第二个整数表示在第一个整数右旋转后给定值处存在的字符,我们必须返回该字符。
例如−
Given string: "abcdef"
Query1: 3 4
Result: 3rd rotation of the above string is: defabc, character at 4th index is: 'b'.
Query2: 6 2
Result: 6th rotation of the above string is: abcdef, character at 2nd index is: 'c'.
我们已经看过了示例,现在让我们来到方法和代码实现部分
方法
在这个问题中,首先我们必须将字符串旋转给定的次数,然后我们必须找到给定索引处的整数。
在进入方法之前,我们必须讨论一些要点−
- 在这个问题中,字符串的旋转方向不建议,即字符串将被旋转到左方向还是右方向。所以,我们将假设是向右旋转。
-
如果我们将任何数组或字符串旋转其长度次数,那么我们将得到完全相同的数组。这意味着,如果我们将给定旋转的整数取模与字符串长度的结果作为旋转次数,即可满足要求。
-
在问题中给出了我们必须以O(1)的常量时间给出解决方案,所以我们只实现高效的方法,并给出一个关于原生方法的简单理念。
在原生方法中,我们可以将当前给定的旋转数与字符串的大小取模,然后得到那个旋转并返回所需索引的字符作为结果。但是这将使给定代码的时间复杂度为O(Q*N)
,其中Q是查询次数,N是字符串的大小。
高效的方法
如果我们用数学方法检查,可以通过在给定字符串后添加相同的字符串来找到每个旋转。例如−
如果给定的字符串是:“abcdef”,我们在它后面添加相同的字符串,结果将是:abcdefabcdef,这意味着在每次完全旋转后,我们将在索引之间得到一个新的字符串。因此,我们可以使用数学公式在O(1)时间内回答每个查询。
示例
// function to answer queries
function valueAtIndex(str, rotation, position){
// getting size of the given string
var n = str.length
// actual posisiton is
var pos = (position + rotation) %n;
console.log("Character present at index " + position + " after " + rotation + " number of rotations is: " + str[pos]);
}
// defining the string
var str = "abcdef"
// quries array
var queries = [[3,4], [6,2]];
// travesing over the queries
for(var i =0; i < queries.length; i++){
valueAtIndex(str, queries[i][0], queries[i][1]);
}
时间和空间复杂性
上述代码的时间复杂度为O(Q),其中Q是查询的次数,因为每个查询的答案都可以在O(1)的时间内给出。上述代码的空间复杂度为O(1),因为在上述代码中没有使用任何额外的空间。
结论
在本教程中,我们实现了一个JavaScript程序,用于在常数时间内查询给定字符串的旋转和第k个字符。我们通过将相同的给定字符串添加到当前字符串之后,生成了一个数学概念,以在O(1)的时间内回答所有查询,使得代码的时间复杂度为O(Q),空间复杂度为O(1)。