java小算法——根据特殊字符切割一维字符数组
2017-04-09 22:08
218 查看
本篇博客主要是为了用java语言解决一个算法小问题的。问题如下:
*假设现在有一个一维数组,我们查找之中的一个特殊字符,随后,将这个一维数组以这个字符为界,将数组分成若干个晓得一维数组,并存入一个二维数组。
(新生成的数组中不含这个字符)*
这个问题的思路为 :
1. 找到这个一维数组的所有的特殊字符位置及其总次数。
2. 将这个一维数组里出现的所有特殊字符位置的下标存下来,以便第四步使用 (以下我们简称为下标数组)
3. 判断需要生成多少个分好的一维数组。
4. 判断此时生成的这个一维数组的长度。
5. 给这个一维数组赋值。
6. 将这个一维数组的引用赋值给二维数组。
7. 返回二维数组。
首先,实现1,2,3步,这个比较简单,只需要for循环遍历,但因为要得知我们生成下标数组的大小,所以需要用for循环两次,根据字符出现的次数,
我们就可以得知我们需要建立多少个一维数组,通过代码如下所示:
接下来,我们需要创建一个一维数组(第4步),来存放我们截取的数组 ,首先我们需要的临时数组(temp[]),这里,我们需要知道这个一维数组的大小,数组的大小有三种情况:
要截取从开始到第一次字符出现的地方。这时数组的大小为index[0]。
要截取最后一次字符出现的地方到结束,这是数组的大小为arr.length - index[index.length - 1] – 1。(即传入 的一维数组长度减去字符最后出现的下标再减一)。
要截取中间正常的地方,只需后一个下标减去前一个下标再减一。即index[i]-index[i-1]-1。
得知了数组的大小,现在我们就可以给这个数组赋值了,赋值和计算数组大小一样同样分三种情况。(第五步)因为比较简单,这里只贴出代码。
最后一步,只需把这个一维数组赋值给二维数组,返回这个二维数组即可。
注意:
这里只需申请一个临时数组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’);//调用我们编好的程序
测试结果如下:
当传入数组为{‘a’ ,’b’ ,’c’ , ‘d’ ,’e’ , ‘h’ ,’b’ , ‘h’ }
![](https://img-blog.csdn.net/20170409220209256?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGN4eTIwMTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
当传入数组为 {‘b’ ,’a’ ,’b’ , ‘c’ ,’d’ , ‘e’ ,’h’ , ‘b’ ,’h’ }
![](https://img-blog.csdn.net/20170409220335993?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGN4eTIwMTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
当传入数组为 {‘b’ ,’a’ ,’b’ , ‘c’ ,’d’ , ‘e’ ,’h’ , ‘b’ ,’h’ ,’b’ }
![](https://img-blog.csdn.net/20170409220451839?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGN4eTIwMTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下面是源代码,这个题在各种面试里有它的增强版出现(如判断是否可以将一维数组拆分为几个和一样的小数组等等),读者可以以此扩展,最后,感谢您的阅读,因为作者本身能力的问题,语句可能比较繁杂,并且可能会有错误 (虽然我自己测试的结果是运行正常的),如果发现错误的话,请及时指出,最后,诚挚感谢您的阅读!。
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];
}
return newArray;
}
}
*假设现在有一个一维数组,我们查找之中的一个特殊字符,随后,将这个一维数组以这个字符为界,将数组分成若干个晓得一维数组,并存入一个二维数组。
(新生成的数组中不含这个字符)*
这个问题的思路为 :
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编写一个算法实现对一个字符数组的所有元素的所有组合
- 蓝桥杯 算法提高VIP 递归倒置字符数组(Java解题)
- java怎么将字符串根据某个字符将字符串分解,并放入数组中
- JAVA代码—算法基础:寻找一维整型数组中的 Peak Element
- java根据特殊字符截取字符串
- JAVA将 带有空格或特殊字符的字符串转换成int数组的方法
- java 字符串 Split切割 特殊字符(例:* ^ : | )注意点
- 这是一个我面试某公司的算法题目:对一个字符数组进行排序,根据给定的字符,大于它的,放在数组的左边,小于它的,放在数组的右边,且数组中的元素之间的相对位置要保持不变。
- 备忘小算法:Java将一维数组数据绘制成N行M列矩阵(如九宫格)
- java二进制,字节数组,字符,十六进制,BCD编码转换 ,GPS,GIS
- Oracle函数 - 根据特定字符切割字符串
- java二进制,字节数组,字符,十六进制,BCD编码转换
- Java过滤特殊字符的正则表达式
- java正则表达式 过滤特殊字符的正则表达式
- 用改过的“数字进制转换”枚举字符组合,这是简化的版本。(java,算法研究)
- Java 实现在文件中写入特殊字符,例如:欧元符号€
- html特殊字符转换(java)
- JAVA实现:给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里
- javascript 根据指定字符把字符串拆分为数组
- Java 特殊字符转义