GetNumber的实现(Python & Java & Golang)

TCO2014的编程赢取门票的题目,大致是从一个数组(大小为K),可以选取1~K个数,必须保证这n个数是从1~n,返回所有的选取方法个数。

思路:首先是得到从1开始连续的数,保存每个数的个数。然后通过排列组合得到结果。

当时采用的Python编写,大致的模样是这样(题目要求的类名就略去了):

def getNumber(type):
    c = [0] * len(type)
    s = 0
    p = 0
    for x in type:
        if x <= len(type):
            c[x-1] += 1
    for i in c:
        if i == 0:
            return s
        else:
            if s == 0:
                s = i
                p = i
            else:
                p *= i
                s += p
    return s

print getNumber([2])
print getNumber([1, 2])
print getNumber([1, 3, 2])
print getNumber([1, 1, 2])
print getNumber([1, 3, 2, 5, 7, 4, 5, 4])
print getNumber([1, 1, 2, 2, 3, 3, 4, 4, 5, 5])

之后尝试了一下 Java 版本:

package org.huys.algo.problem;

public class WinterAndCandies {

    public static int getNumber(int[] type) {
        int[] c = new int[type.length];
        int s = 0;
        int p = 0;

        for (int i=0; i<type.length; i++) {
            if (type[i] <= type.length) {
                c[type[i]-1] += 1;
            }
        }

        for (int i=0; i<c.length; i++) {
            if (c[i] == 0) {
                return s;
            } else {
                if (s == 0) {
                    s = c[i];
                    p = c[i];
                } else {
                    p *= c[i];
                    s += p;
                }
            }
        }
        return s;
    }

    public static void main(String[] args) {
        System.out.println(getNumber(new int[] {2}));
        System.out.println(getNumber(new int[] {1, 2}));
        System.out.println(getNumber(new int[] {1, 3, 2}));
        System.out.println(getNumber(new int[] {1, 1, 2}));
        System.out.println(getNumber(new int[] {1, 3, 2, 5, 7, 4, 5, 4}));
        System.out.println(getNumber(new int[] {1, 1, 2, 2, 3, 3, 4, 4, 5, 5}));
    }
}

最近开始关注golang和swift,两种语言有很多共通之处。golang没有class,还是不免有些不适。

package main

import "fmt"

func getNumber(types []int) int {
	var s = 0
	var p = 0
	var c = make([]int, len(types))

	for _, value := range types {
		if value <= len(types) {
			c[value-1] += 1
		}
	}

	for _, i := range c {
		if i == 0 {
			return s
		} else {
			if s == 0 {
				s = i
				p = i
			} else {
				p *= i
				s += p
			}
		}
	}
	return s
}

func main() {
    fmt.Println(getNumber([]int {2}))
    fmt.Println(getNumber([]int {1, 2}))
    fmt.Println(getNumber([]int {1, 3, 2}))
    fmt.Println(getNumber([]int {1, 1, 2}))
    fmt.Println(getNumber([]int {1, 3, 2, 5, 7, 4, 5, 4}))
    fmt.Println(getNumber([]int {1, 1, 2, 2, 3, 3, 4, 4, 5, 5}))
}

代码中主要是数组相关操作。相对而言,Python 最灵活。Golang 中采用 Slice 语法,与同为C系语言的Java颇为接近。

时间: 2024-10-18 01:22:49

GetNumber的实现(Python & Java & Golang)的相关文章

Python与Golang协程异同

背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 进程和线程的关系: 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. CPU的最小调度单元是线程不是进程,所以单进程多线程也可以利用多核CPU. 协程的定义: 协

# 深入浅出爬虫之道: Python、Golang与GraphQuery的对比

深入浅出爬虫之道: Python.Golang与GraphQuery的对比 本文将分别使用 Python ,Golang 以及 GraphQuery 来解析某网站的 素材详情页面 ,这个页面的特色是具有清晰的数据结构,但是DOM结构不够规范,无法通过单独的选择器定位页面元素,对页面的解析造成了一些曲折.通过这个页面的解析过程,深入浅出的了解爬虫的解析思想与这些语言之间的异同. 深入浅出爬虫之道: Python.Golang与GraphQuery的对比 一.前言 1. 语义化的DOM结构 2. 稳

第一章.java&amp;golang的区别之:闭包

对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是想瞻仰一下如此NB的语言.年前就想在2019年做一件事情,希望能从各个细节处做一次java和golang的对比分析,不评判语言的优劣,只想用简单的语言和可以随时执行的代码来表达出两者的区别和底层涉及到的原理.今天是情人节,馒头妈妈在加班,送给自己一件贴心的礼物,写下第一篇对比文章:java&gola

十大经典排序算法(Python,Java实现)

参照:https://www.cnblogs.com/wuxinyan/p/8615127.html https://www.cnblogs.com/onepixel/articles/7674659.html 一.排序算法分类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排 二.算法复杂度 注(

2019年Python、Golang、Java、C++如何选择?

前言 作为开发者我们都知道,开发后台语言可选择的方向会很多,比如,Java,go,Python,C/C++,PHP,NodeJs….等很多,这么多语言都有什么样的优势?如果让你学习一门后端语言,又该如何选择呢? Java 编译语言,速度适中(2.67s),目前的大型网站都是拿java写的,比如淘宝.京东等.主要特点是稳定,开源性好,具有自己的一套编写规范,开发效率适中,目前最主流的语言. 作为编程语言中的大腕.具有最大的知名度和用户群.无论风起云涌,我自巍然不动.他强任他强,清风拂山岗:他横由他

java、python、golang等开发语言如何快速生成二维码?

免费二维码生成途径非常多!比如比较有名的草料二维码,如果只是简单的使用,用它就足够了.但是如果想大规模的生成,那就不太合适了.再者很多工具都没办法在二维码中加入logo(像微信二维码一样). 接下来,我就说说如何快速的.高质量的生成一个可高度定制的二维码. 二维码的编码算法是公开的,这就意味着大部分的开发语言都可以动图生成.但是在二维码应用如此广泛的今天,还自己去造轮子,如果不是傻,那就是正真的技术极客了. Java有开源的二维码生成库:com.google.zxing,这是谷歌大佬为andro

JavaScript ,Python,java,Go系列算法之选择排序

常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n2) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧.通俗来说就是你们中间谁最小谁就出列,站到队列的最后边,然后继续对着剩余的无序数组说你们中间谁最小谁就出列,站到队列的最后边,一直到最后一个,继续站到最后边,这样数组就有了顺序,从小到大. 1.算法步骤 首先在未排

妈妈再也不担心我的编码问题了。中文编码融汇贯通,windows,django,python,java,html

用django 写一个小web 应用. 该应用里调用的一个业务相关jar 包, 并把jar 包的返回值 显示出来. 就是在windows环境下,使用django框架,用python语言调用java 的jar包,输出内容到,html中.涉及了一堆的编码问题. 过程中不是乱码,就是乱码.总算在高人指点下搞定.特此记录. 妈妈再也不担心我的编码问题了. 1. python 文件头 ,表示文件的内容使用的编码格式 # -*- coding: utf-8 -*- 2. python sys 的编码格式.

Python Java Javascript三种语言的不同之字符串

Python 中以单引号或者双引号括起来的文本 Java 中只能是通过双引号括起来 Javascript 则与Python相同可以通过单引号或者双引号括起来 Python 中跨越多行的文本可以通过"""XX""" Java 则不支持这种跨越多行的文本 JavaScript 可以·XXX·来表示 ,注:'·'是通过制表符的上面的键,即1的左边的键 还是觉得Java没有跨越多行的文本的功能还是有一点不方便