前天在博客头条上看到这样一个帖子,《每个程序员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");
}
}
}