1、利用字符连续出现的次数,编写一个方法,实现字符串压缩功能,如果压缩后的字符串没有变短则返回原来的字符串。
String compress(String str){
//检查压缩后字符串是否变长
int size = countCompression(str);
if(size >= str.length()){
return str;
}
StringBuffer mystr = new StringBuffer();
char last = str.charAt(0);
int count = 1;
for (int i = 1; i < str.length(); i++) {
if(str.charAt(i) == last){
count++;
}else{
mystr.append(last);
mystr.append(count);
mystr.append(last);
mystr.append(count);
last = str.charAt(i);
count = 1;
}
}
mystr.append(last);
mystr.append(count);
return mystr.toString();
}
int countCompression(String str){
if(str ==null || str.isEmpty()) return 0;
char last = str.charAt(0);
int size = 0;
int count = 1;
for (int i = 1; i < str.length(); i++) {
if(str.charAt(i) == last){
count++;
}else{
last = str.charAt(i);
size +=1+String.valueOf(count).length();
count=1;
}
}
size+=1+String.valueOf(count).length();
return size;
}
2、给定一个N×N的矩阵,编写方法使它顺时针旋转90°,不占用额外内存空间。
public void rotate(int[][] matrix, int n){
for (int layer = 0; layer < n / 2; layer++) {
int first = layer;
int last = n-1-layer;
for (int i = first; i < last; ++i) {
int offset = i-first;
//存储上边
int top = matrix[first][i];
//左到上
matrix[first][i] = matrix[last-offset][first];
//下到左
matrix[last-offset][first]=matrix[last][last-offset];
//右到下
matrix[last][last-offset]=matrix[i][last];
//上到右
matrix[i][last] = top;
}
}
}
3、编写一个算法,对于M×N矩阵中为0的元素,将其所在行与列变成0.
一开始我是这样思考的,在找到一个0元素的时候就将它所在行列置为0,这有个很严重的问题,在接下来的遍历中会碰到刚才置为0的行列,很快整个矩阵都会被置为0,所以要先标记0元素所在位置。
public void setZeros(int[][] matrix){
boolean[] row = new boolean[matrix.length];
boolean[] column = new boolean[matrix[0].length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if(matrix[i][j] == 0){
row[i] = true;
column[j] = true;
}
}
}
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if(row[i] || column[i]){
matrix[i][j] = 0;
}
}
}
}