Java pierwsza praca

0

Witam.
Chciałbym zamieścić temat dla ludzi pierwszy raz poszukujących pracy. Same konkrety zadania z testów + rozwiązania. Jeśli moderatorzy nie usuną (czytałem regulamin nie powinni :) ) jutro wstawiam pierwsze testy które już odbyłem a w przypadku następnych będę aktualizował do czasu znalezienia zatrudnienia. Mam nadzieje na podobną aktywność innych użytkowników i wymianę wiedzy, doświadczeń z tego tematu. Cel stanowisko młodszy programista java.

0

Może lepszą alternatywą by było danie takich informacji w Kompendium Wiedzy/mikroblogach a nie w poście na forum?

0

Być może. Jestem nowy na forum dlatego zamieściłem sam pomysł bez treści by nie napracować się na marne. Jeśli zamieściłem w złym dziale proszę o przeniesienie do odpowiedniego.

0

Wydaje mi się, że w Internecie pełno jest tego typu treści. Na prawdę, java jest najpopularniejszą technologią i "java interview questions" wypluwa masę pytań, dlatego nie rozumiem celu kolejnego takiego wątku, tym bardziej, że i na tym forum jest ich trochę.

0

Wątki zawierają luźną rozmowę przejrzałem ok 10 (fakt tylko 10 z wielu). Ja proponuję zadania rozwiązania i dyskusje nad poprawnością rozwiązań, optymalizacje.
datadata jeśli znasz jakieś źródło wiedzy na temat testów kwalifikacyjnych (całych z rozwiązaniami) w polskich firmach będę wdzięczny za podesłanie. Zgadzam się wiedzy w internecie jest wystarczająco ale czas potrzebny do jej wyselekcjonowania można spędzić na pisaniu kodu. Próbuję tylko ułatwić sobie życie jak również innym użytkownikom. Więcej już nie będę przekonywał do swojego pomysłu, jeśli temat przetrwa do jutra zaczynam.

1

Czym się różnią pytania odnośnie Javy w polskich firmach od innych? Wg mnie jeśli ktoś nie potrafi znaleźć sobie czegoś z tak popularnego tematu, to koderem będzie kiepskim, bo bez wyszukiwania informacji nie da się nic zrobić.

Druga sprawa to strasznie boli jak wiele osób jest omotanych przez szkolno-uniwersyteckie podejście do nauki, skoncentrowane wyłącznie na testach i egzaminach. Przecież liczy się wiedza, na której Twój pracodawca będzie zarabiał, a nie to o co jego pracownicy Cię zapytają. Rozmowa o pracę to nie jest matura ani kolokwium, gdzie masz powiedzieć podać poprawną definicję funkcji anonimowej tylko pokazać jak myślisz rozwiązując problem i jak używasz do tego technologii, które znasz. Przypomniała mi się bodajze druga rozmowa o pracę w życiu, w Sabre. Lead projektu, do którego miałem dołączyć zapytał czym się różni interfejs od klasy abstrakcyjnej, po czym obaj zaczeliśmy się śmiać - bo to po prostu jest w każdym wykazie pytań z javy i wydaje mi się, że gość chyba też się przygotowywał do tej rozmowy z Internetu. Najlepszą rozmowę miałem bodajże w IBMie, gdzie każde pytanie dokładnie dotyczyło tego co się akurat dzieje w projekcie i jak moje doświadczenie może się do tego przydać, a jeśli nie bezpośrednio to czy robiłem coś choćby minimalnie zbliżonego.

Obu tych robót nie dostałem i przestałem się przygotowywać do rozmów w taki sposób, na ostatniej mówiłem tylko o tym co robiłem i jak wykorzystywałem swoją wiedzę w konkretnych projektach, telefon z ofertą z górną granicą ustalonych z HRem widełek miałem na drugi dzień.

0

Racja, ale przyznasz, że nic nie zastąpi możliwości zadawania pytań i kontaktu z ludzmi bardziej doświadczonymi. Wiedza jest najważniejsza? Zgadzam się i zdobywam ją w opisany przez Ciebie sposób ale dlaczego nie miałbym spróbować nowych sposobów, jak ten przedstawiony powyżej? Miałem juz nic nie pisać ale nie wytrzymałem ;)

0

Panowie i Panie, jest kompendium wiedzy > Java załóżcie tam odpowiedni dział. Wrzucajcie artykuły-zadania wraz z dobrze opracowanymi rozwiązaniami. Pod tekstami jest możliwość dyskusji.

0

No właśnie dobrze opracowanymi rozwiązaniami... Jakbym nie mial z tym problemu miałbym juz zatrudnienie. Tak czy inaczej mam nadzieję ze mimo wszystko temat sie przyjmie. Jak obiecałem zaczynam.
Zadanie 1 z pierwszej rozmowy.
Given a text and a pattern. Write function that returns a position of the last accurrence pattern in the text if there is no such a pattern return -1.
Example
You are given the text "interminable" "in" is 6
Moja propozycja rozwiązania:

import java.util.Scanner;

public class Pattern {

	public static void main(String[] args) {
		String text ;
		String pattern ;
		int result =-1;
		
		Scanner sc = new Scanner (System.in) ;
		text = sc.next();
		pattern = sc.next();
		
		for(int i = 0 ; i<=text.length()-pattern.length();i++){
			String f = text.substring(i,i+pattern.length());
			if(f.equalsIgnoreCase(pattern)){
				result=i;
			}
			
			
			
		}
	System.out.println("Ostatnie wystapienie ciagu znakow "+pattern +" w wyrazie "+text+ " jest na pozycji "+ result);
	
	}

}
7

Komentarz do Twojego rozwiązania:

  1. Miałeś napisać funkcję, a nie program.
  2. Miałeś wyraźnie zaznaczone jak podawane są argumenty (kto Ci kazał używać standardowego wejścia i wyjścia?)
  3. Używaj biblioteki standardowej zawsze, gdy tylko możesz, chyba, że masz pewność, że Twoje rozwiązanie będzie bardziej optymalne.

Ergo: nie przyjąłbym Cię, bo nie rozumiesz prostego polecenia, a także nie znasz elementarnych metod z biblioteki standardowej.

static int  lastOccurence(String text, String pattern){
	return text.lastIndexOf(pattern);
    }
}

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#lastIndexOf%28java.lang.String%29

I to całe opakowanie jest tylko dlatego, że miałeś napisać funkcję, gdyby nie to wystarczyłoby to, co po returnie.

P.S. Pytanie na boku: jesli ktoś Cię o coś pyta po angielsku, to odpowiadasz mu po polsku? ;)

0

Dziękuję za poświecenie czasu i komentarze.
Faktycznie i przy innych programach nie zwracałem uwagi czy piszę funkcję czy nie.
Z optymalnym kodem pewnie będzie problem.. No cóż mam nadzieję, że nastepne zadania bedą lepsze.

Kolejne:

Palindrom can be read in both directions. How can you determine if string is palindrome. A palindrome has the same letters on both ends of the String. This means "rotator" is palindrome, but "perls" is not. Fill the body of method GetPalindromsCount witch should return number of words, which are palindroms. Function recives parametr wordToCheck contains list of strings.

Moja propozycja rozwiązania:

static int  GetPalindromsCount(List<String> wordToCheck){
		int result =0;
		int result2=0;
		for(int i=0; i<wordToCheck.size();i++){
			String z = wordToCheck.get(i);
			for(int j=0; j<z.length()/2;j++){
			if(z.charAt(j)!=z.charAt(z.length()-1-j)  ){
				result = 0;
				break;
			}
			else{
			 result=1;
			}
		
		}
			result2+=result;
		}
			 return result2;
		
		}
0

Znów tragedia.

  1. Dzielimy kod na funkcje! Powinieneś mieć osobną funkcję isPalindrom(String s) którą sobie wołasz. Bo teraz to jest jakieś spaghetti.
  2. Nadal nie czytasz API języka i wynajdujesz koło na nowo. Nie dało by się wykorzystać tutaj String.substring(), String.length() i String.equals()?
  3. Nie słyszałeś o foreach? o_O
3

Możesz alternatywnie użyć bezpośrednio definicji palindromu. Fakt, może być ciut wolniejsze od iterowania z dwóch stron, ale na pewno czytelniejsze:

    static boolean isPalindrom(String s){
    return s.equals(new StringBuilder(s).reverse().toString());
    }
0

I tak właśnie działają szkoły, zamiast uczyć logicznego myślenia, każą tysięczny raz napisać sortowanie w jakimś języku.
Nie mówię, że sortowanie jest złe. To bardzo ciekawy problem, na którym można wytłumaczyć złożoność obliczeniową.
Ale wszędzie wpychane programowanie imperatywne otępia człowieka. Pisząc tysiące pętelek for w każdej uważając na indeksy, człowiek przestaje myśleć co chce zrobić a skupia się na robieniu sam nie wie czego.

2

Jako, że w komentarzu się nie zmieści to jeszcze ósemkowe rozwiązanie dla palindromu:

public class Palindrome implements PalindromeCheck {

	public long getPalindromsCount(Collection<String> words) {
		return words.stream().filter(w -> isPalindrome(w)).count();
	}

}

interface PalindromeCheck {

	default boolean isPalindrome(String word) {
		return word.equals(new StringBuilder(word).reverse().toString());
	}

}

Jeszcze można by pokombinować jak by tu z tym builderem zaczarować by na lambdzie był, ale jakoś zagmatwanie się tu wda wtedy :D

0

Po raz kolejny dziękuję za zainteresowanie. Myśli, że nadaje się tylko do łopaty odrzuciłem i kształcę się dalej.

  1. Mój błąd będę dzielił kod na funckje.
  2. Tak mógłbym zastosować substring ale zastosowałem charAt. Wiem, że można robić to na kilka sposobów ale skąd mam wiedzieć, który jest właściwy? Poprzednie zadanie lastIndexOf i substring wiec 1-szy jest prostszy, wydajniejszy to widać. Ale w tym wypadku?? Dlatego pytanie kluczowe co znaczy czytać API jezyka?? Jest spis "polecen" do bibliotek i co one robią, tyle.
  3. Rozumiem ze w przypadku kolekcji zawsze strosowac for each. ok.

ubuntuser chciałbym żeby moja wiedza pochodziła z uczelni. Nie nauczyłem tam się niczego. Absolutorium mam od 3 lat a dyplom od tego roku. Jestem samoukiem i pewnie dlatego wykształciłem tyle złych praktyk.

Do wieczora poszperam trochę i wtedy dopiero wstawię kolejne zadanie/zadania.

0
  1. Im kod będzie prostszy i czytelniejszy tym lepiej. Chodzi o to żeby patrząc na kod od razu było wiadomo co on robi. W twoim kodzie widać jakieś 2 zagnieżdżone pętle i zmienne result1 i result2. Gdyby nie nazwa funkcji to idę o zakład że sam potrzebowałbyś chwilę nad tym posiedzieć żeby rozkminić co ten kod robi. W kodzie Koziołka od razu widać co się dzieje.
    Nie chodzi o to żebyś czytał do poduszki API, ale generalnie wychodzi tutaj twój całkowity brak praktyki. Bo gdybyś aktywnie tego języka używał to wiedziałbyś że są już pewne gotowe metody. Poza tym zanim zaczniesz stukać takie niskopoziomowe funkcje należy sprawdzić czy już nie zostały napisane.
  2. W 99% przypadków tak jeśli piszesz explicite pętlę for. Ale zauważ ze java 8 daje nowe zabawki w postaci quasi-funkcyjnego podejścia, które pokazał Koziołek. Poza tym czasem trzeba używać też explicite iteratorów, bo chcemy z kolekcji usuwac w czasie iterowania etc...
0

słaba złożoność obliczeniowa (for w forze)....Najlepszy sposób żeby szybko sprawdzić czy String jest palindromem to odwrócenie go i porównanie z pierwotnym

    static int getPalindromsCount(List<String> wordToCheck) {

        int counter = 0;
        for (int i = 0; i < wordToCheck.size(); i++) {
            String str = wordToCheck.get(i);
            if (str.equals(new StringBuilder(str).reverse().toString())) {
                counter++;
            }
        }
        return counter;
    }
 

generalnie dużo takich zadań programistycznych znajdziecie na https://codility.com

0

Czas na moje kolejne wypociny. Starałem się zastosować do powyższych porad i mam nadzieję, że tym razem będzie lepiej.
Zadanie :
(uciekł mi początek powiedzmy, że Jest tam "write a funciton)

whitch reads a sequence of positive integers from terminal, and terminates when a negative value is typed in.
Right before it terminates it should print out 2 largest numbers (in descending order) ever seen in the sequence and arithmetic mean of all numbers

3 4 9 4 -1
The top 2 largest are 9,4
Arithmetic mean :5 (przepisalem z bledem?)

Moja propozycja rozwiązania:

static  List<Integer> readSequence(){
		List<Integer> intlist= new ArrayList<Integer>();
		Scanner scanner = new Scanner(System.in);
		int x;
		do{
			x=scanner.nextInt();
			intlist.add(x);
		}while(x>=0);
		return intlist;
			
		
	}
	static void printSequence(List<Integer> x){
		for(int i=0;i<x.size();i++){
			System.out.println(x.get(i));                 //tak wiem powinienem użyć for-each użyłem niżej to już nie zmieniam :)  
		}
		
	}
	static void topNumbers(List<Integer> x){
	Collections.sort(x);
	System.out.println(x.get(x.size()-1)+ " "+x.get(x.size()-2));
		
	}
	
	static double arithmetic(List<Integer> x){
		double result=0;
		for(int i:x){
			
			result+=i;
		}
		return result/x.size();
	}
1

a po co budować całą listę? musisz zapamiętać tylko 4 rzeczy
2 największe średnią i ilość elementów

wczytujesz, sprawdzasz czy jest większa od którejś z dwóch pierwszych dodajesz do sumy i zwiększasz licznik

tyle w temacie nie potrzebujesz więcej funkcji

1

Niewiele tu jest dobrze.

  1. Po co zapamiętujesz te wszystkie liczby? Zamiast O(1) pamięci łykasz O(n) bez sensownego powodu.
  2. Sortowanie? Srsly? Zamiast O(n) złożoności obliczeniowej masz O(nlogn) bez sensownego powodu. Jak już bardzo chcesz sobie szukać w całej kolekcji to weź łaskawie zerknij do dokumentacji.
    http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#max-java.util.Collection-
    Sumuj liczby od razu a max1 i max2 szukaj w trakcie wczytywania.
0

To są zadania żeby dostać się na praktyki/staż czy na młodszego programistę? Pytam z ciekawości, bo ofertach pracy dla javy jest przeważnie cała litania wymagań, a tu jakieś proste zadanko z palindromem.

0

Tylko dwie liczby i średnia arytmetyczna to nie wiem czy warto angażować jakiekolwiek kolekcje i tak dzielić na funkcje. Jakbyś miał wypisać więcej takich liczb może SortedSet<Integer> nums = new TreeSet<Integer>(Comparator.<Integer>reverseOrder()); + 2 ify w pętli.

0

Shalom po raz kolejny odsyłasz mnie do dokumentacji. Co ja tam znajdę(pytam poważnie) widzę 10 możliwości zrobienia tego samego i skąd mam zdobyć informację która opcja będzie bardziej wydajna? Do założenia tego tematu myślałem, że przejdę testy gdy program będzie działał poprawnie... Może jakaś podpowiedź co robić, czytać, itd by pisać lepszy kod?

0

Dalej nie mam pomysłu na zadanie z wczoraj. Pomyślałem, że można wczytać wyniki do macierzy 2-elementowej, jednak domyślam się, że sposób jest znowu błędny. Mogę liczyć na kolejna podpowiedź?

0

to słabo przecież wszystko miałeś na tacy tutaj czy w Googlach

import java.util.*;

public class Main {
	public static void main(String[] args) {
		SortedSet<Integer> nums = new TreeSet<>(Comparator.<Integer>reverseOrder());
		Scanner in = new Scanner(System.in);
		int n, counter, sum;
		counter = sum = 0;
		while((n = in.nextInt()) >= 0) {
			nums.add(n);
			sum += n;
			++counter;
		}
		Iterator<Integer> num = nums.iterator();
		System.out.println(num.next()+" "+num.next());
		System.out.println(sum / counter);
	}
}
0

proszę

protected void superfunkcja(){


        Scanner scanner = new Scanner(System.in);
        int x=scanner.nextInt();
        int max1=0;
        int max2=0;
        double suma;
        int counter=0;

        while(x>=0){
        if(x>max2){
            if(x>max1){
               max2=max1; //Edit po uwadze w komentarzach :P
               max1=x;
              
            }else{
               max2=x;
            }
        }
        suma=suma+x;
        counter++;
         x=scanner.nextInt();
        }
System.out.println(max1);
System.out.println(max2);
System.out.println((double)(suma/counter));//Nie pamietam czy trzeba rzutowac  w tym przypadku :D
}


 

wiem wiem spagheti code :D

0

Pytam z ciekawości, bo ofertach pracy dla javy jest przeważnie cała litania wymagań, a tu jakieś proste zadanko z palindromem

Zależy od firmy. Próbowałem do / słyszałem o takich, gdzie

  • nie było żadnego zadania, tylko pytania o projekty,
  • był tylko jakiś bezsensowny test wyboru,
  • dostawałem proste zadanko z palindromem,
  • dają zadania algorytmiczne (Google),

Aż w końcu ostatnio trafiła mi się taka, gdzie zadania na regulara robi się w domu bez jakiegoś limitu czasowego, ale za to są to np.:

  • zrównoleglić commit-log systemu baz danych bez używania synchronized
  • rozszerzyć indeksy pomocnicze o obsługę zapytań zakresowych
  • zoptymalizować synchronizację danych między węzłami klastra opartą na drzewach Merkle
0
  • nie było żadnego zadania, tylko pytania o projekty,

W sumie jak rekrutujesz kogoś kto ma sporo doświadczenia w kilku różnych firmach (szczególnie kiedy są to firmy o jakiejśtam renomie) to można domniemywać że coś musi umieć (gdyby pracował w jednej/dwóch firmach to różnie bywa ;])

Aż w końcu ostatnio trafiła mi się taka, gdzie zadania na regulara robi się w domu bez jakiegoś limitu czasowego, ale za to są to np.:

Mnie te zadania wyglądają mocno na "wrzućmy jakieś zalegające taski na interview dla kandydatów i oni nam je zaklepią za free...".

1 użytkowników online, w tym zalogowanych: 0, gości: 1