算法基础:整数排序问题(连续整数只保留首尾两个数字)

描述:

实现输入一组大于等于0的整数,根据从小到大的顺序排序后输出,排序后有连续数时,只输出连续数中最小和最大的两个数。

输入:

一组大于等于0的整数,不考虑非法输入,各个整数之间以逗号(“,”)分隔, 输入字符串的总长度小于等于100个字节。

输出:

排序后的值,各个整数之间以空格分隔。

样例输入:

1,4,3,110,2,90,7

样例输出:

1 4 7 90 110

代码实现:

package huawei

import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)

func Test3Base() {
	res := "1,4,3,2,90,7,6,17,8,9"
	sortNums(res)
}

func sortNums(resString string) {
	numsStr := strings.Split(resString, ",")
	numsInt := convertToIntSlice(numsStr)

	//排序
	sort.Ints(numsInt)
	//连续数字只保留首尾
	result := removeCenterItems(numsInt)

	fmt.Println(result)
}

//将[]string转为[]int
func convertToIntSlice(numsStr []string) []int {
	numsInt := make([]int, len(numsStr))
	for i, v := range numsStr {
		n, err := strconv.Atoi(v)
		checkError(err, "string to integer")

		numsInt[i] = n
	}

	return numsInt
}

//连续数字只保留首尾
func removeCenterItems(nums []int) []int {
	//需要移除的索引位置
	removeList := make([]int, 0, len(nums))
	for i := 1; i < len(nums)-1; i++ {
		if nums[i] == nums[i-1]+1 && nums[i] == nums[i+1]-1 {
			removeList = append(removeList, i)
		}
	}

	//移除
	for i := len(nums) - 2; i > 0; i-- {
		if checkContains(removeList, i) {
			nums = append(nums[:i], nums[i+1:]...)
		}
	}

	return nums
}

//判断slice中是否存在某个元素
func checkContains(nums []int, value int) bool {
	for _, v := range nums {
		if v == value {
			return true
		}
	}

	return false
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 10:26:40

算法基础:整数排序问题(连续整数只保留首尾两个数字)的相关文章

算法Sedgewick第四版-第1章基础-015一stack只保留last指针

1 /************************************************************************* 2 * 3 * A generic queue, implemented using a *circular* linked list. 4 * (Exercise 1.3.29) 5 * 6 * % java Ex_1_3_29 < tobe.txt 7 * to be or not to be (2 left on queue) 8 * 9

算法题:找出整数数组中两个只出现一次的数字

问题:一个整数数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),空间复杂度为O(1). 分析:这是一个很新颖的关于位运算的题目. 首先考虑这个问题的一个简单版本:一个整数数组里除了一个数字之外,其他的数字都出现两次,请写程序找出这个只出现一次的数字. 这个问题的突破口在哪?题目中数组的性质是只有一个整数出现一次,其他的都出现两次.这样的话就使我们想到了异或运算的性质:任何一个数字异或它自己都等于0.也就是说如果从头到尾依次异或数组中的每

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.请你协助明明完成"去重"与"排序"的工作. Input Param n               输入随机数的个数 inputArray      n个随机整数组成的数组 Return Value

架构师进阶之路——算法基础

算法 定义:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作 特性:五个基本特性,即输入.输出.有穷性.确定性.可行性 算法设计的要求 正确性:算法的正确性是指算法至少应该具有输入.输出和加工处理无歧义性.能正确反映问题的需求.能够得到问题的正确答案 可读性:算法设计的另一个目的是为了便于阅读.理解和交流 健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产出异常或莫名其妙的结果 时间效率高和存储量低:设计算法应该尽量满足时间效率高和存储量低

【算法基础】由插入排序来看如何分析和设计算法

插入排序及其解决思路 算法的作用自然不用多说,无论是在校学生,还是已经工作多年,只要想在计算机这条道路走得更远,算法都是必不可少的. 就像编程语言中的"Hello World!"程序一般,学习算法一开始学的便是排序算法.排序问题在日常生活中也是很常见的,说得专业点: 输入是:n个数的一个序列<a1,a2,...,an?1,an> 输出是:这n个数的一个全新的序列<a,1,a,2,...,a,n?1,a,n>,其特征是a,1≤a,2≤...≤a,n?1≤a,n 举

01.数据结构概念与算法基础

数据结构概念与算法基础 一.数据结构概念 1.数据:是描述客观事务的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合.数据不仅仅包括整型.实型等数值类型,还包括字符及声音.图像.视频等非数值类型. 2.数据元素:是组成数据的.有一定意义的基本单位,在计算机中通常作为整体处理,也被成为记录.比如畜类中,牛.马.羊都属于数据元素. 3.数据项:一个数据元素可以由若干个数据项组成,数据项是数据不可分割的最小单位.比如人这样的数据元素,可以有眼.耳.鼻等数据项. 4.数据对

数据结构(二)之算法基础

一.为什么要学习算法? 先来个简单的算法比较:求sum=1+2+3+...+(n-1)+n的结果. 输入整数n,输出 sum 解法一:for循环 function sum(n){ var s=0; //执行1次 for(var i=1;i<n+1;i++){ s+=i; //执行n+1次 } return s; //执行1次 } 解法二: function sum(n){ return n*(n-1)/2; //执行1次 } 很明显,解法二要优于解法一.因为解法二需要运算的次数少.我们去衡量一个

python小白-day4递归和算法基础

递归&算法基础 一.递归 递归函数的优点是定义简单,逻辑清晰.理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰. 使用递归函数需要注意防止栈溢出.在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧.由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出. 1 2 3 4 5 6 7 8 def calc(n):     print(n)     if n/2>1:         r

算法---大整数相加

原文:算法---大整数相加 开通博客开始第一次写发表算法博客.深知一半算法考试都是用C,C++,由于大四开始到今年毕业工作到现在一直从事C#开发,C++用得很少了.链表,指针也只知道一个概念了.用得没以前熟练了.所以后续更新的算法题我都是基于C#语法的.算法主要体现的是解题思路.跟题目一样,本次算法主要实现大数据相加. 解题思路: 1. 将大数据存储到一个链表中,C#中用List<int>来存储,每个节点表示每一位的数字. {1,2,3,4,5} =>12345 和{9,6,5,9,5}