下面算法想法来自七月算法上的视频:http://www.julyedu.com/video/play/id/28
交换*号到第一位的partition算法:
case class SortNum[T](str: String) {
//因为字符串在scala里面是常量,一旦改变会生成一个新的字符串而不是在原本上更新,所以需要构建一个映射的数组
var strArray = str.toBuffer
//交换函数
def swap(num1: Int, num2: Int){
val temp = str(num1)
strArray(num1) = strArray(num2)
strArray(num2) = temp
}
//初始化参数
val n = str.length
var j = 0
var i = 0
//循环
def sort:String = {
for (j <- 0 until n) {
if (str(j).toString == "*") {
swap(i, j)
i += 1
}
}
strArray.mkString}
}
object SortNum {
implicit def strs[T](str: String):SortNum[T] = SortNum(str)
//> strs: [T](str: String)SortNum[T]
val abc = "*12*23*34" //> abc : String = *12*23*34
abc.sort //> res0: String = ***123234
}
不改变数字位置的算法:
case class SortNum[T](str: String) {
//因为字符串在scala里面是常量,一旦改变会生成一个新的字符串而不是在原本上更新,所以需要构建一个映射的数组
var strArray = str.toBuffer
//使用填充的方法
def fill(i: Int, x: Int) {
strArray(i) = str(x)
}
//初始化参数
val n = str.length
var i = 0
var j = n -1
//从尾部开始扫描,扫描到非*的填充到尾部,扫描到*号填充到开头
def sort:String = {
for (x <- (0 until n) reverse) {
if (str(x).toString != "*") {
fill(j,x)
j = j-1
} else {
fill(i,x)
i +=1}
}
strArray.mkString}
}
object SortNum {
implicit def strs[T](str: String):SortNum[T] = SortNum(str)
//> strs: [T](str: String)SortNum[T]
val abc = "*12*23*34" //> abc : String = *12*23*34
abc.sort //> res0: String = ***122334
}