(1) * 题目:给定一个数组和一个数字,请在这个数组的元素之间添加+-符号,使这个数组元素运算之后的结果是这个数字,
* 比如{2,3,4}1 则2+3-4=1输出这样的等式
* 分析:这是亚马逊2013年在线笔试的一道题目,题目不难,应该使用递归来做
* 若数组只有一个元素,则这个元素和最后数字相等,则输出(元素=数字),
* 若和最后元素不相等,则不输出,返回
* 否则,使用+和-两种符号递归当前数组的第一个元素
*/
void
print
(
int
*
a
,
char
*
b
,
int
len
,
int
sum
){
for
(
int
i
=
0
;
i
<
len
;
i
++){
cout
<<
a
[
i
]<<
b
[
i
];
}
cout
<<
sum
<<
endl
;
}
void
amx01
(
int
*
a
,
int
start
,
int
len
,
int
sum
,
char
*
b
,
int
l
,
int
total
){
if
(
len
==
1
){
if
(
a
[
start
]==
sum
){
b
[
start
-
1
]=
'+'
;
b
[
start
]=
'='
;
//输出b
print
(
a
,
b
,
l
,
total
);
}
else
if
(
a
[
start
]==-
sum
){
b
[
start
-
1
]=
'-'
;
b
[
start
]=
'='
;
print
(
a
,
b
,
l
,
total
);
}
return
;
}
b
[
start
-
1
]=
'+'
;
amx01
(
a
,
start
+
1
,
len
-
1
,
sum
-
a
[
start
],
b
,
l
,
total
);
b
[
start
-
1
]=
'-'
;
amx01
(
a
,
start
+
1
,
len
-
1
,
sum
+
a
[
start
],
b
,
l
,
total
);
}
void
amx
(
int
*
a
,
int
len
,
int
sum
){
if
(
len
<=
0
){
return
;
}
if
(
len
==
1
){
if
(
a
[
0
]==
sum
){
cout
<<
a
[
0
]<<
"="
<<
sum
<<
endl
;
}
return
;
}
char
b
[
len
];
amx01
(
a
,
1
,
len
-
1
,
sum
-
a
[
0
],
b
,
len
,
sum
);
}
int
main
(){
int
a
[
5
]={
3
,
4
,
5
,
6
};
int
sum
=
10
;
amx
(
a
,
4
,
sum
);
}
(2)
* 题目如下:
* 每个大于1的数字都可以由其他数字相加组合而成,例如:
* 5=1+4, 5=2+3;
* 7=1+6, 7=2+5, 7=3+4;
* 现要求输入正整数n(n<50),输出所有除n本身外正数相加的不重复组合
* 【例如】
* 输入:
* 8
* 输出:
* 8=1+2+5
* 8=1+3+4
* 8=1+7
* 8=2+6
* 8=3+5
* 分析:可以使用一个整形数组来记录,不断修改数组中的值达到目的
*/
public class chaif {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
p(10);
}
static void print(int[] r,int len){
for(int i=0;i<=len;i++){
System.out.print(r[i]+" ");
//cout<<r[i]<<" ";
}
System.out.println();
}
public static void p(int n) {
int sum = 0, len = 0;
while (sum < n) {
sum += len;
len++;
}
System.out.println(len);
len--;
int r[]=new int[len];
for (int i = 0; i < len; i++) {
r[i] = i + 1;
}
int k = len - 2;
sum-=r[len-1];
while (true) {
if (k == 0 && r[k] == n) {
break;
}
if (sum < n) {
r[k + 1] = r[k] + 1;
k++;
sum += r[k];
} else {
if (sum == n) {
print(r, k);
}
sum -= r[k];
r[--k]++;
sum++;
}
}
}
}
(3)前序中序,求后序
public class Solution {
/**
* @param args
*/
static int num; static int[] res=new int[7];
static int[] getPostOrderTraverse(int[] preOrder, int[] midOrder) {
boolean state= true;
if(preOrder.length!=midOrder.length){
state = false;
}
if(preOrder.length==midOrder.length){
for(int i=0;i<preOrder.length;i++){
for(int j=0;j<midOrder.length;j++){
if(preOrder[i]==midOrder[j]){
break;
}
state = false;
}
}
}
// return state;
if(midOrder.length==1){
System.out.print(midOrder[0]+"s");
res[num++]=midOrder[0];
return res;
}
// char x = sa.charAt(0);
int x=preOrder[0];
int mid;
for(int j=0;j<midOrder.length;j++){
if(x==midOrder[j]){
mid=j;
int[] c=new int[mid];int cl=0;
int[] d=new int[midOrder.length-mid-1];int dl=0;
for(int k=0;k<midOrder.length;k++){
if(k<mid){
c[cl]=midOrder[k];cl++;
}
else if(k>mid){
d[dl]=midOrder[k];dl++;
}
}
int[] e=new int[c.length];int el=0;
int[] f=new int[midOrder.length-mid];int fl=0;
for(int k=1;k<midOrder.length;k++){
if(k<=mid){
e[el]=preOrder[k];el++;
}
else if(k>mid){
f[fl]=preOrder[k];fl++;
}
}
getPostOrderTraverse(e,c);
getPostOrderTraverse(f,d);
res[num++]=x;
System.out.println(x+"d");
}
}
return res;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[]a={1,3,8,2,6,4,5};
int[]b={8,3,2,1,5,4,6};
int[]c=getPostOrderTraverse(a,b);
for(int i=0;i<c.length;i++){
System.out.print(c[i]);
}
}
}