今天小编匆匆忙忙总算把毕业论文写完了,在这里呢,想把毕业设计的部分过程抽象成具体问题拿过来和大家讨论一下。我想着大致分为4个部分,每个部分都会有问题示例与代码实现。
今天我们先说第一部分。
问题示例:假如给定一个长度长度随机,元素也随机的整数数组a(n),要求按照数组原来的顺序,用[1-n]n个数来重组,变换结果用b(n)表示
例1:a(n)=(3,2,5,6,7);
b(n)=(2,1,3,4,5);
例2:a(n)=(35,2,25,16,2,12,35);
b(n)=(5,1,4,3,1,2,5);
求解思路1:由题意,可先对数组进行排序,得到排序后的数组c(n),然后遍历a(n)的同时遍历c(n),即通过a(i)在c(n)中的位置确定b(n)。实现方法是采用二重循环,伪代码如下:
for i=1:n
for j=1:n
if(c(j)==a(i))
b(i)=j;
end
end
end
但是上述求解思路1没有考虑到a中存在元素相等的情况,就像例2,直接对a进行排序时不对的,因为重复的元素虽然不会影响当前元素,但是会影响后面的元素的位置。比如例2如果按照求解思路1进行,则b(n)=(6,1,5,4,1,3,6),这很明显是与例子不相符合的。所以我们对求解思路1进行改进得到求解思路2.
求解思路2:先对数组a(n)进行遍历,找到a(n)中不重复的元素(按照a(n)中的顺序),得到aa(n),然后用aa(n)代替a(n)执行求解思路1即可得到我们想要的结果。
代码实现:
package biyesheji;
import java.util.Arrays;
public class Array_test01 {
//1.create a function generate random array a(n)
//2.create a function generate b(n)
public int[] Randomarr() {
int leng = (int)(10*Math.random())+1;
int[] a = new int[leng];
for(int i=0;i<leng;i++) {
a[i] = (int)(leng*Math.random());
}
return a;
}
public int[] Generateb(int[] a) {
int[] b = new int[a.length];
int[] cop = new int[a.length];
for(int i=0;i<a.length;i++)
cop[i] = a[i];
int[] aa = Unique(a);
for(int i=0;i<cop.length;i++) {
for(int j=0;j<aa.length;j++) {
if(aa[j]==cop[i]) {
b[i] = j+1;
break;
}
}
}
show(b);
return b;
}
public int[] Unique(int[] a) {
int[] aa = new int[a.length];
Arrays.sort(a);
int data = 0;
for(int i=0,j=0;i<a.length;i++) {
if (a[i]>data) {
data = a[i];
aa[j++] = a[i];
}
}
return aa;
}
public void show(int[] b) {
System.out.println("The Result is:");
for(int i =0;i<b.length;i++) {
System.out.print(b[i]+"--");
}
}
public static void main(String[] args) {
Array_test01 test = new Array_test01();
test.Generateb(test.Randomarr());
}
}
结果演示:
由算法那到代码实现这一步是比较容易的,只需要你对语言比较熟悉,但是由问题到给出解法的这一步才是最关键的,只有思维没有漏洞,程度才不会有bug。
后续小编会继续推出毕业设计后续系列,敬请期待。下一期,我们讨论如何对求得的b(n)求其顺序序列。各位晚安~