Publicación de ejercicio de algoritmo - 51 - Intervalo de resumen (Java)

Intervalo de resumen

1. Introducción

Dada una matriz de números enteros ordenados sin elementos repetidos.

Devuelve una lista de los rangos de rango ordenados más pequeños que cubren todos los números de la matriz. En otras palabras, cada elemento de nums está cubierto exactamente por un cierto rango, y no hay un número x que pertenezca a un cierto rango pero que no pertenezca a nums.

Cada rango de intervalo [a, b] de la lista debe aparecer en el siguiente formato:

"A-> b", si a! = B
"a", si a == b
(la fuente del título: LeetCode )

示例 1:
输入:nums = [0,1,2,4,5,7]
输出:["0->2","4->5","7"]
解释:区间范围是:
[0,2] --> "0->2"
[4,5] --> "4->5"
[7,7] --> "7"
示例 2:
输入:nums = [0,2,3,4,6,8,9]
输出:["0","2->4","6","8->9"]
解释:区间范围是:
[0,0] --> "0"
[2,4] --> "2->4"
[6,6] --> "6"
[8,9] --> "8->9"
示例 3:
输入:nums = []
输出:[]
示例 4:
输入:nums = [-1]
输出:["-1"]
示例 5:
输入:nums = [0]
输出:["0"]
提示:
0 <= nums.length <= 20
-231 <= nums[i] <= 231 - 1
nums 中的所有值都 互不相同
nums 按升序排列

Dos, la solucion

1. Codicioso (la mayor parte del tiempo se dedica al empalme de cuerdas)

public static List<String> summaryRanges(int[] nums) {
    
    
    ArrayList<String> list = new ArrayList<>();
    for (int i = 0; i < nums.length; ) {
    
    
    		//记录当前值
            int j=nums[i];
            //贪心得到连续数的最大值
            while(i+1<nums.length&&nums[i]==(nums[i+1]-1)){
    
    
                i++;
            }
            //将连续数加入list
            //只有一个数则加入这个数即可
            //是一个区间,则加入最小数指向最大数
            list.add(j==nums[i]?(nums[i]+""):(j+"->"+nums[i]));
            i++;
    }
    return list;
}

Optimización codiciosa + empalme:

public static List<String> summaryRanges3(int[] nums) {
    
    
        ArrayList<String> list = new ArrayList<>();
        StringBuilder builder=new StringBuilder();
        for (int i = 0; i < nums.length; ) {
    
    
	        //记录当前值
            int j=nums[i];
            //贪心得到连续数的最大值
            while(i+1<nums.length&&nums[i]==(nums[i+1]-1)){
    
    
                i++;
            }
            //将连续数加入list
            //只有一个数则加入这个数即可
            //是一个区间,则加入最小数指向最大数
            //因为是拼接操作所以用StringBuilder
            if(j==nums[i]){
    
    
                builder.append(nums[i]);
            }else{
    
    
                builder.append(j);
                builder.append("->");
                builder.append(nums[i]);
            }
            list.add(builder.toString());
            builder=new StringBuilder();
            i++;
        }
        return list;
    }

2. Codiciosos + optimización de costura + intercepción

public static List<String> summaryRanges2(int[] nums) {
    
    
        if(nums.length==0) return Arrays.asList();
        StringBuilder builder=new StringBuilder();
        for (int i = 0; i < nums.length; ) {
    
    
        	//记录当前值
            int j=nums[i];
            //贪心得到连续数的最大值
            while(i+1<nums.length&&nums[i]==(nums[i+1]-1)){
    
    
                i++;
            }
            //先将所有结果拼接到字符串中(结果两两之间用,分开),最后按标志分割即可
            if(j==nums[i]){
    
    
                builder.append(nums[i]);
                builder.append(",");
            }else{
    
    
                builder.append(j);
                builder.append("->");
                builder.append(nums[i]);
                builder.append(",");
            }
            i++;
        }
        //除去最后一个,
        builder.setLength(builder.length()-1);
        //将字符串按,分割成数组转成集合
        return Arrays.asList(builder.toString().split(","));
    }

Supongo que te gusta

Origin blog.csdn.net/Inmaturity_7/article/details/112444015
Recomendado
Clasificación