zoukankan      html  css  js  c++  java
  • Golang构造二叉树解决整数排序问题

    [本文出自天外归云的博客园]

    题目详情

     构造二叉树解决这个排序问题,代码如下:

    package pintia
    
    import (
    	"strconv"
    	"strings"
    )
    
    // SortedNumber 具有排序属性的数字结构
    type SortedNumber struct {
    	Self  int
    	Left  *SortedNumber
    	Right *SortedNumber
    }
    
    var sortedNumbers []string
    
    // NumbersSort 将输入的任意n个整数从小到大输出
    // 输入格式:输入在一行中给出n个整数,其间以空格分隔
    // 输出格式:在一行中将n个整数从小到大输出,其间以“->”相连
    func NumbersSort(threeNumsStr string) (sortedNumbersStr string) {
    	nums := strings.Split(threeNumsStr, " ")
    	intNumber, _ := strconv.Atoi(nums[0])
    	sortedNumber := SortedNumber{Self: intNumber}
    	for i := 1; i < len(nums); i++ {
    		intNumber, _ := strconv.Atoi(nums[i])
    		PutNumberOnTree(&sortedNumber, intNumber)
    	}
    	GetNumberOffTree(sortedNumber)
    	sortedNumbersStr = strings.Join(sortedNumbers, "->")
    	return
    }
    
    // GetNumberOffTree 把整数从树上摘下来
    func GetNumberOffTree(sortedNumber SortedNumber) {
    	if sortedNumber.Left != nil {
    		GetNumberOffTree(*sortedNumber.Left)
    	}
    	sortedNumbers = append(sortedNumbers, strconv.Itoa(sortedNumber.Self))
    	if sortedNumber.Right != nil {
    		GetNumberOffTree(*sortedNumber.Right)
    	}
    }
    
    // PutNumberOnTree 把整数放到树上
    func PutNumberOnTree(sortedNumber *SortedNumber, intNumber int) {
    	if intNumber >= sortedNumber.Self {
    		// fmt.Printf("%+v大于%+v
    ", intNumber, sortedNumber.Self)
    		if sortedNumber.Right == nil {
    			sortedNumber.Right = &SortedNumber{
    				Self: intNumber,
    			}
    		} else {
    			PutNumberOnTree(sortedNumber.Right, intNumber)
    		}
    	} else {
    		// fmt.Printf("%+v小于%+v
    ", intNumber, sortedNumber.Self)
    		if sortedNumber.Left == nil {
    			sortedNumber.Left = &SortedNumber{
    				Self: intNumber,
    			}
    		} else {
    			PutNumberOnTree(sortedNumber.Left, intNumber)
    		}
    	}
    }
    

    其中先后用到的思想是:

    1. PutNumberOnTree 数上树(按规则上树)

    2. GetNumberOffTree 树摘数(按规则下树)

    单测:

    package pintia
    
    import (
    	"testing"
    
    	"github.com/stretchr/testify/assert"
    )
    
    func TestThreeNumbersSort(t *testing.T) {
    	// 准备待测数据
    	var numbersStr = "-1 -4 -2 9 -999 8 0 6 4 5 3 2 1 7 8 9 9 100"
    	var expectStr = "-999->-4->-2->-1->0->1->2->3->4->5->6->7->8->8->9->9->9->100"
    	// 执行待测方法
    	sortedNumberStr := NumbersSort(numbersStr)
    	t.Log(sortedNumberStr)
    	// 断言
    	assert := assert.New(t)
    	assert.Equal(expectStr, sortedNumberStr, "排序错误")
    }
    

    测试脚本:

    method=$1
    fileList=`ls`
    cmd="go test -v"
    for file in $fileList
    do
        if echo "$file" | grep -q -E '.go$';then
            cmd="${cmd} $file"
        fi
    done
    cmd="$cmd -test.run $method -gcflags=-l"
    $cmd

    运行脚本命令:

    sh exec_test.sh TestThreeNumbersSort

    测试结果:

  • 相关阅读:
    c++中指向对象的指针为NULL时可以调用对象成员函数吗
    类成员函数作为函数参数出现error C3867:非标准语法;请使用“&”来创建指向成员的指针
    c++能不能给类的成员变量在声明的时候初始化?
    c++中使用指针调用函数和使用指针调用类对象的()重载函数
    c++中怎么自定义事件监听(回调函数)
    Qt中关于release版本程序异常结束问题
    VS中PCL库附加依赖项配置
    c++ primer plus速记
    小知识点杂记
    Qt 5.9使用VTK显示点云
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/14577950.html
Copyright © 2011-2022 走看看