您的位置:首页 > 编程语言 > Java开发

java小算法——根据特殊字符切割一维字符数组

2017-04-09 22:08 218 查看
本篇博客主要是为了用java语言解决一个算法小问题的。问题如下:

*假设现在有一个一维数组,我们查找之中的一个特殊字符,随后,将这个一维数组以这个字符为界,将数组分成若干个晓得一维数组,并存入一个二维数组。

(新生成的数组中不含这个字符)*

这个问题的思路为 :

1. 找到这个一维数组的所有的特殊字符位置及其总次数。

2. 将这个一维数组里出现的所有特殊字符位置的下标存下来,以便第四步使用 (以下我们简称为下标数组)

3. 判断需要生成多少个分好的一维数组。

4. 判断此时生成的这个一维数组的长度。

5. 给这个一维数组赋值。

6. 将这个一维数组的引用赋值给二维数组。

7. 返回二维数组。

首先,实现1,2,3步,这个比较简单,只需要for循环遍历,但因为要得知我们生成下标数组的大小,所以需要用for循环两次,根据字符出现的次数,

我们就可以得知我们需要建立多少个一维数组,通过代码如下所示:

int num = 0;             // 字符总数
int[]  index ;

//得知字符的个数
for(int i = 0 ; i < arr.length ;i++ ){
if(arr[i] == c){
num++;
}
}

index = new int[num];

//创建下标的数组
int h = 0;
for(int i = 0 ; i < arr.length ;i++ ){
if(arr[i] == c){
index[h] = i;
h++;
}
}


接下来,我们需要创建一个一维数组(第4步),来存放我们截取的数组 ,首先我们需要的临时数组(temp[]),这里,我们需要知道这个一维数组的大小,数组的大小有三种情况:

要截取从开始到第一次字符出现的地方。这时数组的大小为index[0]。

要截取最后一次字符出现的地方到结束,这是数组的大小为arr.length - index[index.length - 1] – 1。(即传入 的一维数组长度减去字符最后出现的下标再减一)。

要截取中间正常的地方,只需后一个下标减去前一个下标再减一。即index[i]-index[i-1]-1。

得知了数组的大小,现在我们就可以给这个数组赋值了,赋值和计算数组大小一样同样分三种情况。(第五步)因为比较简单,这里只贴出代码。

for (int j = 0; j < size & size != 0; j++) {
if (i == 0) {                                     //第一个字符前
temp[j] = arr[j];
}

else if(i == num & (index[ num - 1] != arr.length - 1)){   //最后一个字符后
temp[j] = arr[j +index[num - 1] + 1];
}

else{                                          //普遍情况
temp[j] = arr[j -size + index[i]];
}
}


最后一步,只需把这个一维数组赋值给二维数组,返回这个二维数组即可。

注意:

这里只需申请一个临时数组temp,只要不断地去给他赋值就可以,在赋值给二维数组之后,我们可以使其等于null释放(可以省略这一步,java的垃圾回收机制会回收它)。

以上的分析都只分析了一般的情况,有一种特殊情况,传入的字符数组首位或者尾位出现特殊字符时,需要特别注意,根据我们的算法,这时会令其生成长度为0的一维数组,(见运行示例2,3),所以再给临时数组赋值时必须要剔除这种情况。

最后,我们让主函数调用这个函数,并输出二维数组,如下:

public staticvoid main(String[]args) {

char[] array =new char[]{‘a’ , ‘b’ ,’c’ , ‘d’ ,’e’ , ‘h’ ,’b’ , ‘h’ };

char[][]result = spilt(array ,’b’);//调用我们编好的程序

for (inti = 0 ; i < result.length;i++) {
for(int j = 0 ;j < result[i].length ;j++){
System.out.print(result[i][j]);
}
System.out.println();
}
System.out.println("输出完毕");

}


测试结果如下:

当传入数组为{‘a’ ,’b’ ,’c’ , ‘d’ ,’e’ , ‘h’ ,’b’ , ‘h’ }



当传入数组为 {‘b’ ,’a’ ,’b’ , ‘c’ ,’d’ , ‘e’ ,’h’ , ‘b’ ,’h’ }



当传入数组为 {‘b’ ,’a’ ,’b’ , ‘c’ ,’d’ , ‘e’ ,’h’ , ‘b’ ,’h’ ,’b’ }



下面是源代码,这个题在各种面试里有它的增强版出现(如判断是否可以将一维数组拆分为几个和一样的小数组等等),读者可以以此扩展,最后,感谢您的阅读,因为作者本身能力的问题,语句可能比较繁杂,并且可能会有错误 (虽然我自己测试的结果是运行正常的),如果发现错误的话,请及时指出,最后,诚挚感谢您的阅读!

public static char[][] spilt(char[] arr ,char c){

//TODO将以为数组以字符为界拆开并生成一个不规则的二维数组存放

int num = 0; // 字符总数

int[] index ;

//得知字符的个数

for(int i = 0 ;i < arr.length ;i++ ){

if(arr[i] == c){

num++;

}

}

index = newint[num];

//创建下标的数组
int h = 0;
for(int i = 0 ;i < arr.length ;i++ ){
if(arr[i] == c){
index[h] =i;
h++;
}
}

char[][]  newArray =new char[num + 1][];
char[] temp;
for (int i = 0;i < num + 1;i++) {
int size = 0;
if (i == 0) {
if((index[0] == 0)){                    //开头为字符
size = 0;
}
else{
size =index[0];
}
}
else if(i == num){
size = arr.length -index[index.length - 1] - 1;
}

else{
size = index[i] -index[i - 1] - 1;
}

temp = newchar[size];

for (int j = 0;j < size & size != 0; j++) {
if (i == 0) {                                     //第一个字符前
temp[j] =arr[j];
}

else if(i == num & (index[ num - 1] != arr.length - 1)){   //最后一个字符后
temp[j] =arr[j +index[num - 1] + 1];
}

else{                                          //普遍情况
temp[j] =arr[j -size +index[i]];
}
}
newArray[i] =temp;


}

return newArray;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 算法