Go 语言解面试题1

Iilovetopview · · 11775 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

/* 比较一下 

:http://blog.csdn.net/iilovetopview/article/details/43745059

go的运算效率逊于D(LDC 编译器0.15.1(LLVM3.6 ,MSVC64))

用“数学公式”法解下题:

 有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。
  比如f(13)=6,现在f(1)=1,问下一个最大的f(n)=n的n是什么?

*/

package main
import ("fmt"
"time"
"math"
)
 
var aa map[int]int
var Ac []int
func main() {
	fmt.Println("(go Language)  Please wait for some minutes,will found Next Fn(n) = n ,the n is:")
	n := 1
	count :=0
	pos := 0
	
	t :=time.Now()
	for n =1;n<200000;n++ {
		aa = make(map[int]int)
    	Ac = make([]int,10)


		pos = Fn(n)
	 
		if n == pos {
			count++
			fmt.Println("n is :",n," Fn(n) is :",pos)
			if(count >1) {break}
		}
	}
	fmt.Println("time is :",time.Now().Sub(t).String())
	fmt.Println(n," stop")
	fmt.Println("test 199981 is :",Fn_test(199981))
}
 


func Fn(n int) int {
	i:=0
	y:=0
	for x :=n;x>=1;x/=10 {
		y=x%10
		aa[i] =y
		Ac[i] =y
		i++
	}
	Ac = Ac[0:i]  //关键
	m := len(Ac)-1
	h :=aa[m]
	if( n%gPow(m) == 0) {
		return fnA(h,m)
	}else{
	 return  fnA(h,m)+fnB(m-1)
	}
}


func fnA(h int,m int) int {
	if(h == 0){
		return 0
	}else if h==1 {
		if(m == 0) {
			return 1
		} else{
			 return  m*gPow(m-1)+1
			}
	}else {
		if(m == 0) {
			return 1
		} else{ 
				return  gPow(m)+h*m*gPow(m-1)
		}
	}
}
 


func fnB(m int) int { 
	  ..... //代码略
	return  sum + fnB(m-1)
}


func gPow(m int) int {
	return int(math.Pow10(m)) 
}
/*------------测试-------------*/
func Fn_test(n int) int {
	 total:= 0
	for i:=0;i<=n;i++ {
		total += Count(i)
	}
	return total
}
func Count(n int) int {
	num:=0
	for t:= n;t >=1;t=t/10 {
		if(t%10 == 1) {
			num++
		}
	}
	return num
}



有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:Iilovetopview

查看原文:Go 语言解面试题1

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

11775 次点击  
加入收藏 微博
2 回复  |  直到 2000-01-01 00:00:00
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传