输入字符串
[“ ac”,“ bd”,“ ce”,“ aaa”,“ xyz”,“ bbb”,“ abc”,“ kt”,“ zb”]
我想要以下输出:
[List(“ ac”,“ bd”,“ ce”,“ zb”),List(“ aaa”,“ bbb”),List(“ abc”,“ xyz”),List(“ kt” )]
这里的逻辑是我需要将类似的元素分组到列表中。
第一个列表中的模式是,我跳过了一个字母。
第二个列表中的模式是,我有一个字母重复三次。
第三个列表中的模式是,我连续3个字母。
将所有这些分组之后,我有一个不属于上述任何一种模式的元素,因此将其添加到单独的列表中。
我不确定scala中的算法/解决方案。任何帮助表示赞赏。 TIA。
答案 0 :(得分:3)
构造字符串的旋转等价表示的方法。
def normalizedRepresentation(str: String) = {
str.map(char => (char - str.charAt(0) + 'a').asInstanceOf[Char])
}
def rotationalEquivalenceRepresentation(str: String) = {
val normalizedStr = normalizedRepresentation(str)
normalizedStr.map(char => if (char < 'a') (char + 26).asInstanceOf[Char] else char.asInstanceOf[Char])
}
然后
scala> val input = List("ac","bd","ce", "aaa","xyz","bbb","abc","kt","zb")
input: List[String] = List(ac, bd, ce, aaa, xyz, bbb, abc, kt, zb)
scala> input.map(str => normalizedRepresentation(str))
res0: List[String] = List(ac, ac, ac, aaa, abc, aaa, abc, aj, aI)
scala> input.map(str => rotationalEquivalenceRepresentation(str))
res1: List[String] = List(ac, ac, ac, aaa, abc, aaa, abc, aj, ac)
scala>
scala> input.groupBy(str => rotationalEquivalenceRepresentation(str))
res2: scala.collection.immutable.Map[String,List[String]] = Map(abc -> List(xyz, abc), aaa -> List(aaa, bbb), ac -> List(ac, bd, ce, zb), aj -> List(kt))
scala> input.groupBy(str => rotationalEquivalenceRepresentation(str)).values.toList
res3: List[List[String]] = List(List(xyz, abc), List(aaa, bbb), List(ac, bd, ce, zb), List(kt))
答案 1 :(得分:1)
似乎是没有意义的锻炼。
val input = List("ac","bd","ce", "aaa","xyz","bbb","abc","kt","zb")
val (skip1, rest1) =
input.partition(s => s.length == 2 && s(1)-s(0) == 2 || s(0)-s(1) == 24)
//skip1: List[String] = List(ac, bd, ce, zb)
//rest1: List[String] = List(aaa, xyz, bbb, abc, kt)
val (same3, rest2) =
rest1.partition(s => s.length == 3 && s.forall(_ == s(0)))
//same3: List[String] = List(aaa, bbb)
//rest2: List[String] = List(xyz, abc, kt)
val (seq3, rest3) =
rest2.partition(s => s.length == 3 && s(1)-s(0) == 1 && s(2)-s(1) == 1)
//seq3: List[String] = List(xyz, abc)
//rest3: List[String] = List(kt)
答案 2 :(得分:1)
这是该问题的通用解决方案。
jQuery(document).ready( function($) {
$("#searchFormSubmit").click(function() {
event.preventDefault();
console.log("In First Part of Search Submit!");
var address = $('#address').val();
$.ajax({
url : the_ajax_script.ajaxurl,
type : 'post',
data : {
action : 'travel_app_ajaxdata',
thangs : $('#CoreSearchForm').serialize()
},
success : function( response ) {
returnData = JSON.parse(response);
console.log("This is my Clean HTML" + returnData[0]);
console.log("This is my Location" + returnData[1]);
console.log("TEST DATA - EVENT: " + returnData[1]["resultsPage"]);
$('.return_data').html(returnData[0]);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert("Status: " + textStatus); alert("Error: " + errorThrown);
}
});
});
});
通过计算一对字母之间的距离,然后将“旋转组”表示为字符串中每个相邻对之间的距离的列表来工作。
这是带有错误检查功能的带注释版本:
def rotationGroup(s: String) =
s.sliding(2).toList.map(s => ('a' + s(1) - s(0)) % 26)
list.groupBy(rotationGroup).values