用tinyscript解一些典型算法题,小试牛刀
生活随笔
收集整理的這篇文章主要介紹了
用tinyscript解一些典型算法题,小试牛刀
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
問題1:用1、2、2、3、4、5這六個數字,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"與"5"不能相連。
原題鏈接:http://blog.csdn.net/zhutulang/article/details/7775644
tinyscript解法
numbers=[1,2,2,3,4,5]; numbers.permuteAll((e) -> {if(e[3]!=4&&!(abs(e.indexOf(3)-e.indexOf(5))==1)){println(e);} });運行結果,篇幅原因只貼部分:
[1, 2, 2, 3, 4, 5] [1, 2, 2, 5, 4, 3] [1, 2, 3, 2, 4, 5] [1, 2, 3, 2, 5, 4] [1, 2, 3, 4, 2, 5] [1, 2, 3, 4, 5, 2] [1, 2, 5, 4, 3, 2] [1, 2, 5, 4, 2, 3] [1, 2, 5, 2, 4, 3] [1, 2, 5, 2, 3, 4] [1, 2, 2, 3, 4, 5] [1, 2, 2, 5, 4, 3] [1, 2, 3, 2, 4, 5] [1, 2, 3, 2, 5, 4] [1, 2, 3, 4, 2, 5] [1, 2, 3, 4, 5, 2] [1, 2, 5, 4, 3, 2] [1, 2, 5, 4, 2, 3]Java解法:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.TreeSet;public class Sort {static TreeSet<String> ts=new TreeSet<String>();public static void main(String[] args) {String[] d={"1","2","2","3","4","5"};List<String> s=new ArrayList<String>();StringBuilder rs=new StringBuilder();for(int i=0;i<d.length;i++)s.add(d[i]);pl(s, rs);Iterator<String> iterator=ts.iterator();while (iterator.hasNext()) System.out.println(iterator.next());System.out.println("總數是:"+ts.size());}//全排列public static void pl(List<String> s,StringBuilder rs){if(s.size()==1){rs.append(s.get(0));if(rs.indexOf("4")!=2&& (!rs.toString().contains("35")&& !rs.toString().contains("53")) ){ts.add(rs.toString());}//if(rs.length()>0)rs.delete(rs.length()-1, rs.length());}else{for(int i=0;i<s.size();i++){rs.append(s.get(i));List<String> tmp=new ArrayList<String>(); for(String a:s) tmp.add(a); tmp.remove(i);pl(tmp, rs);//if(rs.length()>0)rs.delete(rs.length()-1, rs.length()); } } } }問題2:abc+def=ghi,以上字母為1-9的數字,且兩兩不相同,求可能的組合。
原題鏈接:
tinyscript解法
/** abc+def=ghi,以上字母為1-9的數字,且兩兩不相同。 */numbers=[1 .. 9]; numbers.permuteAll((e) -> {if(e[1]*100+e[2]*10+e[3]+e[4]*100+e[5]*10+e[6]==e[7]*100+e[8]*10+e[9]){println(e);} });運行結果,篇幅原因只貼部分:
[1, 2, 4, 6, 5, 9, 7, 8, 3] [1, 2, 5, 7, 3, 9, 8, 6, 4] [1, 2, 7, 3, 5, 9, 4, 8, 6] [1, 2, 7, 3, 6, 8, 4, 9, 5] [1, 2, 8, 4, 3, 9, 5, 6, 7] [1, 2, 8, 3, 6, 7, 4, 9, 5] [1, 2, 9, 4, 3, 8, 5, 6, 7] [1, 2, 9, 6, 5, 4, 7, 8, 3] [1, 2, 9, 7, 3, 5, 8, 6, 4] [1, 2, 9, 3, 5, 7, 4, 8, 6] [1, 3, 4, 6, 5, 8, 7, 9, 2] [1, 3, 5, 7, 2, 9, 8, 6, 4] [1, 3, 8, 4, 2, 9, 5, 6, 7] [1, 3, 8, 6, 5, 4, 7, 9, 2] [1, 3, 9, 4, 2, 8, 5, 6, 7]C解法
#include <stdio.h> void main() {int count=0,sum=0,num1,num2,a,b,c,d,e,f;for(a=1;a<=9;a++)for(b=0;b<=9;b++){if(a==b)continue;for(c=1;c<=9;c++){if(a==c||b==c)continue;//**********************num1=a*100+b*10+c;for(d=1;d<=9;d++){if(d==a||d==b||d==c)continue;//printf("good1 \n");for(e=0;e<=9;e++){if(d==e||e==a||e==b||e==c)continue;for(f=1;f<=9;f++){if(d==f||e==f||f==a||f==b||f==c)continue; num2=d*100+e*10+f;sum=num1+num2;if(sum<=1000||sum%10==a||sum%10==b||sum%10==c||sum%10==d||sum%10==e||sum%10==f||(sum/10)%10==a||(sum/10)%10==b||(sum/10)%10==c||(sum/10)%10==d||(sum/10)%10==e||(sum/10)%10==f||(sum/100)%10==a||(sum/100)%10==b||(sum/100)%10==c||(sum/100)%10==d||(sum/100)%10==e||(sum/100)%10==f||sum/1000==a||sum/1000==b||sum/1000==c||sum/1000==d||sum/1000==e||sum/1000==f||sum%10==(sum/10)%10||sum%10==(sum/100)%10||sum%10==sum/1000||(sum/10)%10==(sum/100)%10||(sum/10)%10==sum/1000||(sum/100)%10==sum/1000)continue;count++;printf("%d + %d = %d \n",num1,num2,sum);}}}}}printf("count=%d\n",count);}問題3:馬克思手稿中有一道趣味數學題:有30個人,其中有男人、女人和小孩,在一家飯館里吃飯 共花了50先令, 每個男人各花5先令,每個女人各花2先令,每個小孩各花1先令,問男人、女人和小孩各有幾人?
tinysctipt解法
elements = [0 ..30];elements.permute(3,(e) -> {if(sum(e)==30 && e[1]*5+e[2]*2+e[3]==50){println(e);} });運行結果:
[0, 20, 10] [1, 16, 13] [2, 12, 16] [3, 8, 19] [4, 4, 22] [5, 0, 25]Java解法
for(int a=1;a<50/5;a++) {for(int b=1;b<50/2;b++) {for(int c=1;c<50/1;c++) {if((a+b+c)==30 && a*5+b*2+c*1==50) {System.out.println("男人:"+a+" 女人:"+b+" 小孩:"+c );}}} }或者
public static void main(String[] args) {for (int a = 1; a <= 5; a++) {for (int b = 1; b <= 20; b++) {if (4 * a + b == 20) {int c = 30 - a - b;if (c != 0) {System.out.println(a + "--" + b + "--" + c);}}}}}問題4:青年歌手參加歌曲大獎賽,有n(n>2)個評委打分,試編程求選手的平均得分(去掉一個最高分和 一個最低分)
tinyscript解法
score(scores)->{return (sum(scores)-max(scores)-min(scores))/(scores.size()-2); };println(score(elements));C解法
#include<stdio.h> void main() { int sum = 0,i; double avg,b; int a[10]; int max,min; for(i=0;i<10;i++) { scanf("%d",&a[i]); if(i==0)//只有第一次賦值max=min=a[0] { max = a[0]; min = a[0]; } if(max<a[i]) max = a[i]; if(min>a[i]) min = a[i]; sum = sum+a[i]; } b = sum-max-min; avg = b/8.0; printf("平均分為:%.2lf\n",avg);//保留兩位小數 }背包問題:有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6, * 現在給你個承重為10的背包,如何讓背包里裝入的物品具有最大的價值總和?
tinyscript解法:
/*** 有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,* 現在給你個承重為10的背包,如何讓背包里裝入的物品具有最大的價值總和?*/class Obj{name,weight,value;Obj(name,weight,value){this.name=name;this.weight=weight;this.value=value;} } list=[new Obj("a",2,6),new Obj("b",2,3),new Obj("c",6,5),new Obj("d",5,4),new Obj("e",4,6)]; //上面是初始化數據,下面是解決問題的代碼 sum=0; ele=null; for(i:[1 ..list.size()]){list.combine(i,(e) -> { if(sum(e.weight)<=10&&sum(e.value)>sum){ele=e;sum=sum(e.value);}}); } println(sum); println(ele);運行結果:
15 [Obj[name=a,weight=2,value=6], Obj[name=b,weight=2,value=3], Obj[name=e,weight=4,value=6]]上面是窮舉法速度非常慢,但是可以求出最優解;下面是次優解寫法,性能有非常大的提高,但是有可能不是最優解。
/*** 有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,* 現在給你個承重為10的背包,如何讓背包里裝入的物品具有最大的價值總和?*/class Obj{name,weight,value;Obj(name,weight,value){this.name=name;this.weight=weight;this.value=value;} } list=[new Obj("a",2,6.0),new Obj("b",2,3.0),new Obj("c",6,5.0),new Obj("d",5,4.0),new Obj("e",4,6.0)]; //上面是初始化數據,下面是解決問題的代碼 sum=0; list.sort((l,r)->{return (r.value/r.weight).compareTo(l.value/l.weight);}); result=[]; for(i:[1 ..list.size()]){if(sum+list[i].weight<=10){sum+=list[i].weight;result.add(list[i]);} } println(sum); println(result);java代碼:
public void bag(int[] weights, int[] values, int bagsize){ int[][] result = new int[weights.length][bagsize+1]; for(int i=0;i<bagsize+1;i++){ for(int j=0;j<weights.length;j++){ if(i==0){ result[j][i] = 0; System.out.print(result[j][i]+" "); continue; }else if(j==0){ if(weights[j]<=i){ result[j][i] = values[j]; }else{ result[j][i] = 0; } }else{ if(weights[j]<=i){ result[j][i] = result[j-1][i-weights[j]]+values[j]>result[j-1][i]?result[j-1][i-weights[j]]+values[j]:result[j-1][i]; }else{ result[j][i] = result[j-1][i]; } } } } for(int m=0;m<weights.length;m++){ for(int n=0;n<bagsize+1;n++){ System.out.print(result[m][n]+" "); } System.out.println(""); }問題5:基金量化投資:選擇一個月收益排名前50名,并且最大回撤率小于50%,并且基金經理任職連續超過一年,管理的基金在同類基金排名前20%,列出符合條件的基金。
可能有的同學說,你這個也就做做算法窮舉類題目不錯別的又干不了什么,說的非常不錯,接下來展示一個實際業務。
由于篇幅原件,數據只提供部分表達意思即可:
基金數據
code1 name date value 003860 招商招旭純債C 2017/7/1 1.188147057 160630 鵬華國防 2017/7/1 1.58792832 160643 鵬華中證 2017/7/1 0.922133108 001838 國投瑞銀 2017/7/1 1.537061604 630011 華商主題精選 2017/7/1 1.443479085 003860 招商招旭純債C 2017/7/2 1.044532467 160630 鵬華國防 2017/7/2 1.438359583 160643 鵬華中證 2017/7/2 0.894619462 001838 國投瑞銀 2017/7/2 1.734040948 630011 華商主題精選 2017/7/2 1.000473053 003860 招商招旭純債C 2017/7/3 1.717215024 160630 鵬華國防 2017/7/3 1.780652734 160643 鵬華中證 2017/7/3 1.686924083基金經理積分數據
code3 manager3 type repay avg rank 003860 王平 混合型 10.17% 3.98% 30% 160630 蔣秋潔 混合型 23.10% 3.98% 15% 160643 李佳亮 固定收益 1.35% -3.17% 13% 001838 陳劍波 分級杠桿 -17.23% -3.17% 80% 630011 王平 股票型 154.65% 20.92% 0% 161724 蔣秋潔 混合型 18.32% 4.08% 15% 168204 李佳亮 股票型 4.41% 4.55% 50% 002779 陳劍波 固定收益 42.68% 4.55% 1% 161032 王平 分級杠桿 4.41% 7.96% 75% 161725 李佳亮 股票型 25.27% 7.96% 18%基金經理與基金管理關系數據
code2 firstdt lastdt manager2 003860 2006 2007 蔣秋潔 160630 2005 2008 李佳亮 160643 2005 2006 陳劍波 001838 2006 2010 王平 630011 2005 2006 蔣秋潔 003860 2007 2010 李佳亮 160630 2008 2009 陳劍波 160643 2006 2007 王平 001838 2010 2013 蔣秋潔 630011 2006 2009 李佳亮 003860 2010 2012 陳劍波 160630 2009 2013 王平 160643 2007 2013 蔣秋潔 001838 2013 2014 李佳亮 630011 2009 2010 陳劍波 003860 2012 2017 王平 160630 2015 2017 蔣秋潔 160643 2014 2017 李佳亮 001838 2014 2017 陳劍波 630011 2010 2017 王平 161724 2006 2007 蔣秋潔 168204 2005 2008 李佳亮 002779 2005 2006 陳劍波 161032 2006 2010 王平 161725 2005 2006 蔣秋潔 161724 2007 2010 李佳亮 168204 2008 2009 陳劍波 002779 2006 2007 王平 161032 2010 2013 蔣秋潔tinyscript解法:
/*基金量化投資:選擇一個月收益排名前50名,并且最大回撤率小于50%,并且基金經理任職連續超過一年,管理的基金在同類基金排名前20%,列出符合條件的基金。 */dataset = readTxt("/example/dayinfo.txt"); groupds =dataset.insertColumn(3,"UP").insertColumn(4,"rate").convert("value","double").group("code1"); groupds.update("UP",(e)->{last = 31-e;first = 1-e;return (value[last]-value[first])/value[first]; });//求一月的凈值groupds.update("rate",(e)->{minvalue = value[0]; for(i = 1;i<=31-e;i++){if(value[i]<minvalue){minvalue = value[i];//對每一個值求在之后的最小凈值}}return (value[0]-minvalue)/value[0]; });groupds.update("rate",(e)->{last = 31-e;first = 1-e;maxvalue = 0;for(i = first;i<=last;i++){maxvalue = max(maxvalue,rate[i]);}return maxvalue; });//對每一個凈值的回撤率進行比較求出最大回撤率//過濾回撤率大于50%的數據 groupds = groupds.sort("UP desc"); groupds = groupds.limit(1,5);groupds = groupds.filterGroup(rate[0]<=0.5);dataset2 = readTxt("/example/history.txt"); dataset3 = readTxt("/example/score.txt"); result = dataset2.match(dataset3,code3==code2&&manager3==manager2); result = result.convert("lastdt","int").convert("firstdt","int").convert("rank","double").filter(lastdt==2017&&lastdt-firstdt>=3).filter(rank<=0.2); result = result.match(groupds,code3==code1);for(i = 1;i<=result.getRows();i++){println("符合條件的基金代碼:"+result[i][1]); }運行結果:
符合條件的基金代碼:160643 符合條件的基金代碼:630011 符合條件的基金代碼:161724java解法:
用Java寫,不僅僅是燒腦,長度比上面所有的長度都長......
總結
以上只是tinyscript腳本的簡單展示,還有很多很多特性沒有展示,比如數據庫開發相關有比較大的突破,敬請期待下次分享。
喜歡我博客的同學請關注我,以便第一時間接受到相關信息推送。
轉載于:https://my.oschina.net/tinyframework/blog/1506471
總結
以上是生活随笔為你收集整理的用tinyscript解一些典型算法题,小试牛刀的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyODPS学习:使用DataFrame
- 下一篇: 要素图层范围查询属性arcgis api