Sword se refiere a la oferta-41-Suma de dos números VS y una secuencia positiva continua de s-java

Preguntas y pruebas

package sword041;
/* 
题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。假设有多个数字的和等于s,输出随意一对就可以。

比如输入数组{1,2,4,7,11,15}和数字15.因为4+11=15。因此输出4和11.

题目二:输入一个正数s,打印出全部的和为s的连续正数序列(至少含有两个数字)。

比如输入15。因为1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续的序列1——5,4——6。7——8.

*/

import java.util.List;

public class main {
	
	public static void main(String[] args) {
		int[][] testTable = {
   
   {1,2,4,7,11,15},{-1,-100,3,99}};
		int[] testTable2={15,1};
		for (int i=0;i<testTable.length;i++) {
			test(testTable[i],testTable2[i]);
		}
		
		int[] testTable3 = {15,10,6};
		for (int ito : testTable3) {
			test2(ito);
		}
	}
		 
	private static void test(int[] ito,int ito2) {
		Solution solution=new Solution();
		long begin = System.currentTimeMillis();
		for (int i = 0; i < ito.length; i++) {
		    System.out.print(ito[i]+" ");		    
		}
		System.out.println();
		//开始时打印数组
		System.out.println(ito2);
		
		System.out.println( "rtn=" );
		solution.findNumbersWithSum(ito,ito2);//执行程序
		long end = System.currentTimeMillis();	

		System.out.println();
		System.out.println("耗时:" + (end - begin) + "ms");
		System.out.println("-------------------");
	}
	
	private static void test2(int ito) {
		Solution solution = new Solution();
		long begin = System.currentTimeMillis();
		System.out.print(ito);		    
		System.out.println();
		//开始时打印数组
		
		System.out.println( "rtn=" );
		solution.findContinuousSequence(ito);//执行程序
		long end = System.currentTimeMillis();			

		System.out.println();
		System.out.println("耗时:" + (end - begin) + "ms");
		System.out.println("-------------------");
	}

}

Tema 1 (exitoso)

Ingrese una matriz en orden ascendente y un número s, y encuentre dos números en la matriz para que su suma sea exactamente s. Si la suma de varios números es igual as, simplemente genere cualquier par.

Por ejemplo, la matriz de entrada {1, 2, 4, 7, 11, 15} y el número 15. Dado que 4 + 11 = 15, se generan 4 y 11.

Muchas personas pensarán inmediatamente en el método O (n2), es decir, fijarán primero un número en la matriz y luego determinarán si la suma de los n-1 números restantes en la matriz y su suma es igual as.

Luego buscamos mejores algoritmos. Primero seleccionamos dos números en la matriz, si su suma es igual a la entrada s, hemos encontrado los dos números que estamos buscando. ¿Y si es menor que s? Esperamos que la suma de los dos números sea mayor. Dado que la matriz ya está ordenada, podemos considerar elegir el número después del número más pequeño. Debido a que el número en la parte posterior es mayor, entonces la suma de estos dos números también debería ser mayor, puede ser igual al número de entrada s. De manera similar, cuando la suma de los dos números es mayor que el número ingresado, podemos elegir el número antes del número mayor, porque el número al frente es menor.

Tema 2 (exitoso)

Ingrese un número positivo s e imprima todas las secuencias numéricas positivas consecutivas (que contengan al menos dos números) que sumen s. Por ejemplo, ingrese 15, porque 1 + 2 + 3 + 4 + 5 = 4 + 5 + 6 = 7 + 8 = 15, por lo que el resultado imprime 3 secuencias consecutivas 1——5,4——6,7—— 8.

Con la experiencia anterior, también consideramos el uso de dos árboles, pequeño y grande, para representar los valores mínimo y máximo de la secuencia, respectivamente. Primero inicialice pequeño a 1 y grande a 2. Si la suma de la secuencia de pequeño a grande es mayor que s, podemos eliminar el valor más pequeño de la secuencia, es decir, aumentar el valor de pequeño. Si la suma de la secuencia de pequeña a grande es menor que s, podemos aumentar grande para que esta secuencia contenga más números. Debido a que esta secuencia debe tener al menos dos números, seguimos aumentando hasta que (1 + s) / 2.

package sword041;


class Solution {
    public void findNumbersWithSum(int[] nums, int k) {
        int length=nums.length;
        if(length==0 || length == 1){
        	return;
        }
        int begin = 0;
        int end = length -1;
        while(begin <= end) {
        	int sum = nums[begin] + nums[end];
        	if(sum == k) {
        		System.out.println(nums[begin] + " "+ nums[end]);
        		return;
        	}
        	if(sum > k) {
        		end--;
        	}else {
        		begin++;
        	}
        }        
    }
    
    public void findContinuousSequence(int k) {
    	if(k <= 2) {
    		return;
    	}
        int begin = 1;
        int end = 2;
        int sum = 3;
        while(begin <= end && end <= k) {
        	if(sum == k) {
        		if(begin != end) {
        			System.out.println(begin + " "+ end);	
        		}
        		end++;
        		sum+=end;
        		continue;
        	}
        	if(sum > k && begin != end) {        		
        		sum-=begin;
        		begin++;
        	}else {
        		end++;
        		sum+=end;
        	}
        }
           
    }
}

 

Supongo que te gusta

Origin blog.csdn.net/xushiyu1996818/article/details/112170210
Recomendado
Clasificación