Java :: Aufgabe #191 :: Lösung #2

3 Lösungen Lösungen öffentlich
#191

Ermittlung von Zeilen- und Spaltennummer eines 2D-Array-Feldes

Anfänger - Java von hollst - 09.02.2018 um 11:03 Uhr
Die Felder eines "unendlich" großen 2D-Arrays seien nach folgendem "Diagonal-Schema" nummeriert:

1 2 4 7 . . .
3 5 8 . . . .
6 9 . . . . .
10 . . . . . .
. . . . . . usw.

Man schreibe ein Programm, das für eine gegebene Feldnummer N die Zeilen- (ZN) und die Spaltennummer (SN) zurückgibt.
Zeilen- und Spaltennummerierungen beginnen wie üblich mit 0.

Beispiele:
N = 8 -> ZN = 1, SN = 2
N = 31 -> ZN = 2, SN = 5
#2
vote_ok
von Alhazen (220 Punkte) - 19.04.2018 um 12:07 Uhr
Quellcode ausblenden Java-Code
package zweiDArray;

public class twoDimArray {		
	private int size;	
	private int[][] container;	
	private int[] beginings;	
	private int[] initOffset;
	
	/**
	 * Die Strategie:
	 * Als erstes werden die Anfangselemente jeder Spalte bestimmt und eingetragen.
	 * Von einer Spalte zur nächsten gibt es einen Offset der sich von Spalte zu Spalte um 1 erhöht.
	 * Der Initiale Spalten-Offset ist immer so hoch wie Spaltennummer +1.
	 * Mit den gesammelten Werten kann nun das Array befüllt werden.
	 * Für die Suche kann einfach über das Array iteriert werden.
	 */


	public twoDimArray(int maxNodes){
		this.size = getSize(maxNodes);
		
		this.container  = new int[this.size][];
		for(int i = 0; i < this.size; i++){
			this.container[i] = new int[this.size-i];
		}
		
		 this.beginings= new int[size];
		 beginings = getBeginings(size);
		 
		  this.initOffset = getInitOffset(size);
		  
		  fullFillContainer();
	}
	
	public void getPos(int value){
		// Die äußere Schleife iteriert über die Zeilen ...
		for(int row = 0; row < this.container.length; row++){
			//... und die innere über die Spalten.
			for(int collum = 0; collum < this.container[row].length; collum++){
				if(container[row][collum] == value){
					// Wurde der richtige Wert gefunden, brauchen die Zähler der Schleifen nur noch ausgegeben zu werden.
					System.out.println("Position von " + value + " = (" + row + ":" + collum + ")");
				}
			}
		}			
	}

	public void print(){
		for(int[] row : this.container){
			for(int element : row){
				System.out.print(element + ", ");
			}
			System.out.print("\n");
		}
	}
	
	private void fullFillContainer(){
		int offset = 0;
		// Die Anfangswerte werden in die Zeilen-Arrays geschrieben.
		for(int i = 0; i < size; i++){
			 this.container[i][0] = this.beginings[i];
		}
		
		for(int row = 0; row < this.container.length; row++){
			// Der initiale Zeilen-Offset der atuellen Zeilen wird geholt.
			offset = this.initOffset[row];
			// Dann wird über die aktuelle Zeile Iteriert ...
			for(int element = 1; element < this.container[row].length; element++){
				//... und das aktuelle Feld aus vorherigem Feld und Offset berechnet.
				this.container[row][element] = this.container[row][element - 1] + offset;
				// Hat man ein Feld berechnet muss der Offset für das nächste Feld erhöt werden.
				offset++;
			}
		}
	}
	
	private int[] getInitOffset(int size){
		int[] initOffset = new int[size];
		// Der Initiale Spalten-Offset ist immer so hoch wie Spaltennummer +1.
		for(int k = 0; k < size; k++){
			initOffset[k] = k + 1;
		}
		return initOffset;
	}
	
	private int[] getBeginings(int size){
		int offset = 2;	// Das zweite element ist immer die 3.
		// Der Offset beginnt also bei 2.
		int zahl = 1;	// Das erste Element ist immer die 1.
		int[] beginings = new int[size];
		// Von einer Spalte zur nächsten gibt es einen Offset der sich von Spalte zu Spalte um 1 erhöht.
		for(int k = 0; k < beginings.length; k++){
			beginings[k] = zahl;
			zahl = zahl + offset;
			offset++;
		}
		return beginings;
	}
	
	private int getSize(int border){
		// Berechnet die Kantenlänge des Dreiecks.
		int size = 0;
		int sum = 0;
		// Jetzt wird die Gaußsche Summenformel bemüht, bis die Summe größer ist
		// als der Grenzwert für das Zahlendreieck.
		for(;sum < border;size++){
			sum += size;
		}
		// Die Anzahl der Iterationen -1 ist gleich der Kantenlänge.
		return size-1;
	}
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben