java学习练习(每个程序员1小时内必须解决的5个编程问题)

来源:互联网 发布:阿里专有云asp csp 编辑:程序博客网 时间:2024/05/21 14:00

前天在博客头条上看到这样一个帖子,《每个程序员1小时内必须解决的5个编程问题》http://www.codeceo.com/article/5-problems-programmer-1-hour.html

尝试做了一下,花时间比较长:

问题1

使用for循环、while循环和递归写出3个函数来计算给定数列的总和。

问题2
编写一个交错合并列表元素的函数。例如:给定的两个列表为[a,B,C]和[1,2,3],函数返回[a,1,B,2,C,3]。

问题3
编写一个计算前100位斐波那契数的函数。根据定义,斐波那契序列的前两位数字是0和1,随后的每个数字是前两个数字的和。例如,前10位斐波那契数为:0,1,1,2,3,5,8,13,21,34。

问题4

编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为95021。

问题5

编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。


天天都在学习,代码没有整理比较混乱,代码如下:

题一:

/** * 使用for循环、while循环和递归写出3个函数来计算给定数列的总和。 */public class T1 {public static void main(String[] args) {Integer[] uu={4,65,6,1,6,8,1,4,4};int y=for1(uu).intValue();System.out.println(y);int[] uu1={4,65,6,1,6,8,1,4,4};int k=dd(uu1,uu1.length);System.out.println(k);}//for循环,泛型public static <T> Number for1(T t[]){Number t1=0;int o=t.length;Number[] t2=new Number[o];if(t[0] instanceof Number){for(int i=0;i<o;i++){t2[i]=(Number)t[i];}for(int i=0;i<o;i++){t1=t2[i].doubleValue()+t1.doubleValue();}}return t1;}//while循环省略//递归static int dd(int t[],int p){int i=t.length-p;int pp=0;if(i-p<t.length){pp=dd(t,p-1)+t[i];}return pp;}}

题二:
/** * 问题2 * 编写一个交错合并列表元素的函数。例如:给定的两个列表为[a,B,C]和[1,2,3],函数返回[a,1,B,2,C,3]。 */public class T2 {public static void main(String[] args) {String[] str={"a","B","C"};int[] r={1,2,3};String[] str1=pp1(str,r);for(String d:str1){System.out.print(d+"\t");}}static String[] pp1(String[] str1,int[] p1){int l=str1.length+p1.length;String[] str2=new String[l];for(int i=0;i<l;i++){if(i%2==0){str2[i]=str1[i/2];}else{str2[i]=p1[i/2]+"";}}return str2;}}

题三:

/** * 问题3 * 编写一个计算前100位斐波那契数的函数。根据定义,斐波那契序列的前两位数字是0和1,随后的每个数字是前两个数字的和。 * 例如,前10位斐波那契数为:0,1,1,2,3,5,8,13,21,34。 */public class T3 {public static void main(String[] args) {int[] pp1=pp();for(int n:pp1){System.out.print(n+"\t");}}static int[] pp(){int[] pp=new int[100];pp[0]=0;pp[1]=1;for(int i=2;i<100;i++){pp[i]=pp[i-1]+pp[i-2];}return pp;}}

题四:

/** * 问题4 编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为95021。 */public class T4 {public static void main(String[] args) {int[] i={50,2,1,9};System.out.println(kk(i));}static int kk(int[] pp) {int o = pp.length;int p = 1;//列出枚举法所有的可能for (int i = 1; i <=o; i++) {p *= i;}//存放所有组合数的数组int[] pp1=new int[p];//将随机下标进行对比,符合条件放入数组int[][] pp2=new int[p][o];for(int i=0;i<p;){int[] ff=kk2(o);boolean temp=true;for(int j=0;j<i;j++){if(kk3(pp2[j],ff)){temp=false;}}if(temp){pp2[i]=ff;i++;}}
<span style="white-space:pre"></span>//得到组合后的数组for(int i=0;i<p;i++){pp1[i]=kk4(pp2[i],pp);}
<span style="white-space:pre"></span>//取最大值int max=0;for(int w=0;w<p;w++){System.out.println(pp1[w]);if(pp1[w]>max){max=pp1[w];}}return max;}//判断一个数的位数static int kk1(int p) {int re = 0;if (p == 0) {re = 1;} else {re++;int q = 0;while (q == 0) {if (p / 10 != 0) {p=p/10;re++;} else {q = 1;}}}return re;}//对下标进行随机排序static int[] kk2(int p1){int[] p=new int[p1];int o=p.length;int i=0;while(i<o){int u=(int)(Math.random()*o);boolean temp=true;for(int j=0;j<i;j++){if(u==p[j]){temp=false;}}if(temp){p[i]=u;i++;}}return p;}//判断两个int数组中元素是否相同static boolean kk3(int[] p1,int[] p2){boolean temp=true;//长度肯定相同在这不做判断int y=p1.length;for(int i=0;i<y;i++){if(p1[i]!=p2[i]){temp=false;break;}}return temp;}//将下标转化为数字,p存放的是pp的下标static int kk4(int[] p,int[] pp){int o=p.length;int rr=0;for(int i=0;i<o-1;i++){rr=(int) (pp[p[i]]+rr*Math.pow(10,kk1(pp[p[i]])));}return (int) (rr*Math.pow(10,kk1(pp[p[o-1]]))+pp[p[o-1]]);}}

题五:

/** * 问题5 编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。 例如:1 + 2 + * 34 – 5 + 67 – 8 + 9 = 100。 */public class T5 {public static void main(String[] args) {int s = (int) Math.pow(3, 8);int[][] p1 = new int[s][8];// 将p1进行赋值p1 = kk1(p1);int l1 = p1.length;for (int i = 0; i < l1; i++) {//kk5(p1[i], kk4(p1[i]));}}/** * 对p1数组进行赋值,总共有3的8次个长度为8的一维数组 *  * @param p1 * @return */static int[][] kk1(int[][] p1) {// k为3的8次方int k = p1.length, p = 0;while (p < k) {int[] p2 = new int[8];for (int i = 0; i < 8; i++) {p2[i] = (int) (Math.random() * 3);}boolean temp = true;for (int i = 0; i < p; i++) {if (kk3(p1[i], p2)) {temp = false;break;}}if (temp) {p1[p] = p2;p++;}}return p1;}/** * 判断两个int数组中元素是否相同(复制于类T4) *  * @param p1 * @param p2 * @return */static boolean kk3(int[] p1, int[] p2) {boolean temp = true;// 长度肯定相同在这不做判断int y = p1.length;for (int i = 0; i < y; i++) {if (p1[i] != p2[i]) {temp = false;break;}}return temp;}/** * 根据数组提供数据翻译成:加、减、空,返回处理后的数组int[] *  * @param p * @return */static int[] kk4(int[] p) {int l = p.length;int i = 0, i1 = 0;int[] p2 = new int[l + 1];while (i < l + 1) {int o = i;for (int j = i; j < l; j++) {if (p[j] == 0) {i++;} else {break;}}int u1 = i - o, u2 = o + 1;for (int s = 0; s < u1; s++) {u2 = u2 * 10 + (++o) + 1;}p2[i1] = u2;i1++;i++;}return p2;}/** * 根据kk4处理好的数组和+-运算数组得最终处理结果,p为+-符号,p2为源数组 *  * @param p * @param p2 */static void kk5(int[] p, int[] p2) {int l1 = p.length;int i = 0, j = 0, n = p2[0];while (true) {while (j < l1) {if (p[j] == 0) {j++;} else {break;}}if (j != l1) {switch (p[j]) {case 1:n = n - p2[i + 1];break;case 2:n = n + p2[i + 1];break;}j++;}i++;if (i == p2.length) {break;} else {if (p2[i] == 0) {break;}}}
<span style="white-space:pre"></span>//复制于上面部分,添加输出语句if (n == 100) {int q = 0, w = 0, e = p2[0];while (true) {while (w < l1) {if (p[w] == 0) {w++;} else {break;}}if (w != l1) {switch (p[w]) {case 1:e = e - p2[q + 1];System.out.print(p2[q] + "-");break;case 2:e = e + p2[q + 1];System.out.print(p2[q] + "+");break;}w++;}q++;if (q == p2.length) {break;} else {if (p2[q] == 0) {System.out.print(p2[q - 1]);break;}}}System.out.print("=" + e + "\n");}}}


0 0
原创粉丝点击