面试算法题解(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HcJsJqJSSM/article/details/84326822

一:题目一

 题目描述:

对字符串进行RLE压缩,将相邻的相同字符,用计数值和字符值来代替。例如:aaabccccccddeee,则可用3a1b6c2d3e来代替。

输入描述:

输入为a-z,A-Z的字符串,且字符串不为空,如aaabccccccddeee

输出描述:

压缩后的字符串,如3a1b6c2d3e

解决思路:

首先是输入一个字符串,然后转换为字符数组,从第一个字符开始统计,如果和第一个相等就计数,如果不相等就立即追加字符串中,然后从当前不相等的字符开始继续执行for循环.最后进行统计输出.

AC代码如下.

解法一:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
         Scanner cin=new Scanner(System.in);
         String str = cin.nextLine();
         StringBuilder builderZip=new StringBuilder();
         char[] chars = str.toCharArray();
         char c = chars[0];
         int count=0; 
         for(int i=0;i<chars.length;i++)
         { 
        	 if(c==chars[i]){
    		       count++;
    		 }else {
    		       builderZip.append(count+""+c);
    		       c = chars[i];
    		       count =1;
    		 }
         }
          builderZip.append(count+""+c);
        System.out.println(builderZip.toString());
	}
}

解法二:(将一个字符串中的相同字符使用空串替代,计算替换后新的字符串长度差,可以计算出所有相同字符的个数了.)

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
    	 Scanner cin=new Scanner(System.in);
         String str = cin.nextLine();
         int length=0;
         while(str.length()>0){
        	 String tempStr=String.valueOf(str.charAt(0));
        	 String newStr=str.replaceAll(tempStr, "");
        	 length=str.length()-newStr.length();
        	 str=newStr;
        	 System.out.print(length+""+tempStr);
        	 length=0;
         }
	}
}

二 :题目二

题目描述:

一个非空整数数组,计算连续子数组的最大和。如果最大的和为正数,则输出这个数;如果最大的和为负数或0,则输出0.

输入描述:

3,-5,7,-2,8

输出描述:

13

解题思路:

动态规划直接解决,连续子数组最大和,注意输入的是一个数组,但是没有指定数组的大小,输入字符串然后进行分割进行转换为数组.

不使用自带的库函数.

就是当前所有的值的和,和接下来的值进行比较如果大于就赋值新的,如果小于那么当前的最大值任然是这个值,继续运算.从后往前计算.

AC代码如下:

import java.util.Scanner;
public class Main {
     public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        String[] strings=cin.nextLine().split(",");
        int[] nums=new int[strings.length];
        for(int i=0;i<nums.length;i++){
            nums[i]=Integer.valueOf(strings[i]);
        }
        System.out.println(getMaxResult(nums));
     }
     public static int getMaxResult(int[] nums){
           int res,fmax;
           fmax=nums[0];
           res=fmax;
           if(nums.length==0){
               return 0;
           }
           for(int i=1;i<nums.length;i++){
               if(fmax+nums[i]>nums[i]){
                   fmax=fmax+nums[i];
               }else{
                   fmax=nums[i];
               }
               if(res<fmax){
                   res=fmax;
               }
           }
               if(res>0){
                   return res;
               }else{
                   return 0;
           }
     }
}

猜你喜欢

转载自blog.csdn.net/HcJsJqJSSM/article/details/84326822