Category Archives: Java

Top interview question Leetcode

Easy

Array

Strings

Linked List

Trees

Sorting and Searching

Dynamic Programming

Design

Math

 Fizz Buzz
 Count Primes
 Power of Three
 Roman to Integer

Others

 Number of 1 Bits
 Hamming Distance
 Reverse Bits
 Pascal’s Triangle
 Valid Parentheses
 Missing Number

Medium

Array and Strings

 3Sum
 Set Matrix Zeroes
 Group Anagrams
 Longest Substring Without Repeating Characters
 Longest Palindromic Substring
 Increasing Triplet Subsequence
 Missing Ranges
 Count and Say

 

Linked List

 Add Two Numbers
 Odd Even Linked List
 Intersection of Two Linked Lists

 

Trees and Graphs

 Binary Tree Inorder Traversal
 Binary Tree Zigzag Level Order Traversal
 Construct Binary Tree from Preorder and Inorder Traversal
 Populating Next Right Pointers in Each Node
 Kth Smallest Element in a BST
 Inorder Successor in BST
 Number of Islands

 

Backtracking

 Letter Combinations of a Phone Number
 Generate Parentheses
 Permutations
 Subsets
 Word Search

 

Sorting and Searching

 Sort Colors
 Top K Frequent Elements
 Kth Largest Element in an Array
 Find Peak Element
 Search for a Range
 Merge Intervals
 Search in Rotated Sorted Array
 Meeting Rooms II
 Search a 2D Matrix II

 

Dynamic Programming

 Jump Game
 Unique Paths
 Coin Change
 Longest Increasing Subsequence

 

Design

 Flatten 2D Vector
 Serialize and Deserialize Binary Tree
 Insert Delete GetRandom O(1)
 Design Tic-Tac-Toe

 

Math

 Happy Number
 Factorial Trailing Zeroes
 Excel Sheet Column Number
 Pow(x, n)
 Sqrt(x)
 Divide Two Integers
 Fraction to Recurring Decimal

 

Others

 Sum of Two Integers
 Evaluate Reverse Polish Notation
 Majority Element
 Find the Celebrity
 Task Scheduler

 Hard

Array and Strings

 Product of Array Except Self
 Spiral Matrix
 4Sum II
 Container With Most Water
 Game of Life
 First Missing Positive
 Longest Consecutive Sequence
 Find the Duplicate Number
 Longest Substring with At Most K Distinct Characters
 Basic Calculator II
 Sliding Window Maximum
 Minimum Window Substring

 

Linked List

 Merge k Sorted Lists
 Sort List
 Copy List with Random Pointer

 

Trees and Graphs

 Word Ladder
 Surrounded Regions
 Lowest Common Ancestor of a Binary Tree
 Binary Tree Maximum Path Sum
 Friend Circles
 Course Schedule
 Course Schedule II
 Longest Increasing Path in a Matrix
 Alien Dictionary
 Count of Smaller Numbers After Self

 

Backtracking

 Palindrome Partitioning
 Word Search II
 Remove Invalid Parentheses
 Wildcard Matching
 Regular Expression Matching

 

Sorting and Searching

 Wiggle Sort II
 Kth Smallest Element in a Sorted Matrix
 Median of Two Sorted Arrays

 

Dynamic Programming

 Maximum Product Subarray
 Decode Ways
 Best Time to Buy and Sell Stock with Cooldown
 Perfect Squares
 Word Break
 Word Break II
 Burst Balloons

 

Design

 LRU Cache
 Implement Trie (Prefix Tree)
 Flatten Nested List Iterator
 Find Median from Data Stream
 Range Sum Query 2D – Mutable

 

Math

 Largest Number
 Max Points on a Line

 

Others

 Queue Reconstruction by Height
 Trapping Rain Water
 The Skyline Problem
 Largest Rectangle in Histogram

 

 

 

NetBeans no Ubuntu

Este post demonstra a instalação do NetBeans no Ubuntu.

OBS: Tive problemas com o OpenJDK Headless, então sugiro que utilize a instalação normal.

Caso o JDK não esteja instalado

$ sudo apt install openjdk-11-jdk

Baixar ou instalar o NetBeans. Neste exemplo, baixei e descompactei no diretório,

/opt/netbeans-12.3/

Para executar, digite o comando,

$ /hd1/opt/netbeans-12.3/netbeans/bin/netbeans

Implementação CRUD Java com MongoDB

Introdução

Este artigo demonstra a integração do MongoDB com CRUD em Java.

Pré-requisitos

Instalação do MongoDB – Veja artigo Instalando MongoDB

Projeto GitHub

Você pode baixar o projeto whs-test

O Projeto

Trata-se de um Projeto Maven com dependência com o mongo-java-driver e gson.

O Código

Método create

Conectando ao MongoDB


MongoClient mongoClient = new MongoClient( "localhost" , 27017 );

Acessando um Banco de Dados


MongoDatabase db = mongoClient.getDatabase("test");

Acessando uma Collection

Através desse acesso é possível efetuar as operações no Banco de Dados como consulta, inclusão, alteração e exclusão.

MongoCollection<Document> collection = database.getCollection("test");

Criando o objeto Document


Map<String, Object> map = g.fromJson(jsonContent, new TypeToken<Map<String, Object>>() {}.getType());

Document doc = new Document(map);

Inserindo o registro


collection.insertOne(doc);

Método update

Listando todos os registros

Para este exemplo, buscamos todos os registros e atualizamos o campo “updated”. Pode-se utilizar uma buscas específica de um determinado registo.

MongoCursor<Document> cursor = collection.find().iterator();

Atualizando os objetos Document

while (cursor.hasNext()) {
Document doc = cursor.next();
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
Map<String,Object> mapDoc = (Map)gson.fromJson(doc.toJson(), Map.class);
mapDoc.put("updated", new Date().toString());
Document docUp = new Document(mapDoc);
}

Atualizando os registros no Banco de Dados

No bloco while, invocamos o método updateOne (atualiza o primeiro registro a encontrar o critério).

collection.updateOne(doc, new Document("$set", new Document("updated", new Date())));

Método delete

Para o exemplo abaixo, buscamos o registro a ser excluído através de uma busca pelo campo “tableName” igual a “Customer”.

MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
MongoDatabase db = mongoClient.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("test");
collection.deleteOne(Filters.eq("tableName","Customer"));

Método list

No método list, buscamos todos os registros do banco “test” e escrevemos no console o respectivo JSON.

MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
MongoDatabase db = mongoClient.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("test");
MongoCursor<Document> cursor = collection.find().iterator();
try {
while (cursor.hasNext()) {
System.out.println(cursor.next().toJson());
}
} finally {
cursor.close();
}

Event Sourcing

Introdução

A idéia é armazenar os eventos gerados pelo domínio e que, mais tarde, será reconstruído o estado atual do objeto em questão.

Conceito

Salvando objetos

  1. Criar um evento para cada estado do objeto
    1. BankAccountCreated (id: 123 owner: John Doe)
    2. DepositPerformed (accountId: 123 amount: 20USD)
    3. OwnerChanged (accountId: 123 newOwnerId: 234)
    4. WithdrawalPerformed (accountId: 123 amount: 10USD)
  2. Deve-se preservar a ordem dos eventos

 

Framework

  1. Eventuate – Solução que provê um modelo de programação orientada a eventos.
    1. Fonte: http://eventuate.io/

Exemplos

  1. https://github.com/cer/event-sourcing-examples

 

 

Annotations do Spring

@Configuration

É uma annotation que indica que determinada classe possui métodos que expõe beans.

@Controller

Identifica classes que possuem métodos que processam requests numa aplicação web.

@Repository

Identifica classes que isolam o acesso aos dados da sua aplicação. Comumente associada a DAO’s.

@Service

Identifica classes que representam a ideia do Service do Domain Driven Design. Para ficar menos teórico pense em classes que representam algum fluxo de negócio da sua aplicação. Por exemplo, um fluxo de finalização de compra envolve atualizar manipular o carrinho, enviar email, processar pagamento etc. Este é o típico código que temos dificuldade de saber onde vamos colocar, em geral ele pode ficar num Service.

@Component

A annotation básica que indica que uma classe vai ser gerenciada pelo container do Spring. Todas as annotations descritas acima são, na verdade, derivadas de @Component. A ideia é justamente passar mais semântica.

@ComponentScan

Em geral você a usa em classes de configuração(@Configuration) indicando quais pacotes ou classes devem ser scaneadas pelo Spring para que essa configuração funcione.

@Bean

Anotação utilizada em cima dos métodos de uma classe, geralmente marcada com @Configuration, indicando que o Spring deve invocar aquele método e gerenciar o objeto retornado por ele. Quando digo gerenciar é que agora este objeto pode ser injetado em qualquer ponto da sua aplicação.

@Autowired

Anotação utilizada para marcar o ponto de injeção na sua classe. Você pode colocar ela sobre atributos ou sobre o seu construtor com argumentos.

@Scope

Annotation utilizada para marcar o tempo de vida de um objeto gerenciado pelo container. Pode ser utilizada em classes anotadas com @Component, ou alguma de suas derivações. Além disso também pode usada em métodos anotados com @Bean. Quando você não utiliza nenhuma, o escopo default do objeto é o de aplicação, o que significa que vai existir apenas uma instância dele durante a execução do programa. Você alterar isso, anotando o local e usando alguma das constantes que existem na classe ConfigurableBeanFactory ou WebApplicationContext.

@RequestMapping

Geralmente utilizada em cima dos métodos de uma classe anotada com @Controller. Serve para você colocar os endereços da sua aplicação que, quando acessados por algum cliente, deverão ser direcionados para o determinado método.

@ResponseBody

Utilizada em métodos anotados com @RequestMapping para indicar que o retorno do método deve ser automaticamente escrito na resposta para o cliente. Muito comum quando queremos retornar JSON ou XML em função de algum objeto da aplicação.

@Primary

Caso você tenha dois métodos anotados com @Bean e com ambos retornando o mesmo tipo de objeto, como o Spring vai saber qual dos dois injetar por default em algum ponto da sua aplicação? É para isso que serve a annotation @Primary. Indica qual é a opção padrão de injeção. Caso você não queira usar a padrão, pode recorrer a annotation @Qualifier.

@Profile

Indica em qual profile tal bean deve ser carregado. Muito comum quando você tem classes que só devem ser carregadas em ambiente de dev ou de produção. Essa eu utilizo bastante e acho uma ideia simples, mas super relevante dentro do Spring.

@SpringBootApplication

Para quem usa Spring Boot, essa é uma das primeiras que você. Ela engloba a @Component, @ComponentScan e mais uma chamada @EnableAutoConfiguration, que é utilizada pelo Spring Boot para tentar advinhar as configurações necessárias para rodar o seu projeto.

Bom, acho que é isso aí. Adoro escrever posts que foram solicitados diretamente pela galera que acompanha o meu trabalho, é uma motivação bem grande.

@EnableAsync

Essa aqui não é tão comum, mas muitas vezes você precisa ações no sistema em background(outra thread). Essa annotation deve ser colocada em alguma classe marcada com @Configuration, para que o Spring habilite o suporte a execução assíncrona.

@Async

Uma vez que seu projeto habilitou o uso de execução de métodos assíncronos com a @EnableAsync, você pode marcar qualquer método de um bean gerenciado do projeto com essa annotation. Quando tal método for invocado, o Spring vai garantir que a execução dele será em outra thread.

Domain Driven Design

Domain Driven Design, ou seja, Desenvolvimento Orientado a Domínio.

O objetivo é focar no domínio da solução, através de um contexto apresentado, determinar a solução de maneira que atenda:

  1. Alinhar o código com as regras de negócio – para atender, pode-se utilizar XP, aproximando a equipe de negócio a equipe de desenvolvimento
  2. Minimizar acoplamento – fazer com que as partes do sistema interaja entre si, evitando dependência entre os módulos
  3. Favorecer o reuso – módulos do sistema, podem ser reutilizados em outras funções
  4. Independência de tecnologia – focar na regra de negócio e código

O modelo de software típico de DDD consiste:

  1. Interface com Usuário – responsável por interagir com o usuário, capturando intenções e informações
  2. Aplicação – camada intermediária entre a camada 1 e 3, atuando como comunicação de dados
  3. Domínio – camada com as regras de negócio. Toda a inteligência do sistema está aqui.
  4. Infra-estrutura – camada responsável pelos recursos técnicos, geralmente são classes que se comunicam com Banco de Dados e mensagens

mapping-ddd-to-java-ee

Exemplos:

https://github.com/paoesco/cargotracker-ddd

https://github.com/citerus/dddsample-core

https://github.com/olivergierke/spring-restbucks

http://www.the-coder-life.com/2016/02/domain-driven-design-hands-on-example.html

https://github.com/simbo1905/root-objects

Links:

http://www.agileandart.com/2010/07/16/ddd-introducao-a-domain-driven-design/

 

KumuluzEE – Framework para microserviços

A utilização da arquitetura de microserviços vem se tornando padrão entre as empresas.

Com a busca de informações dessa nova forma de desenvolver os aplicativos, encontrei uma solução de framework para utilização de microserviços, o KumuluzEE.

Por ser uma solução compatível com JEE, torna-se uma grande opção, tanto para novos projetos quanto para aplicações existentes e que deseja-se transformá-las em microserviços.

Fonte:

https://ee.kumuluz.com/

Conheça o KumuluzEE – seu novo framework para Microservices

 

Maven – Tutorial

Introdução

O Maven é uma excelente ferramenta para gerenciar e implantar projetos Java. O objetivo desse post é apresentar de forma clara e fácil como utilizar o Maven.

Instalação

  1. Baixe o Maven de https://www.apache.org/.
  2. Descompacte onde deseja que fique a instalação.
  3. Em Variáveis de Ambiente, crie a variável MAVEN_HOME ou MVN_HOME
  4. Na variável Path, inclua no início do trecho %MAVEN_HOME%\bin;
  5. Abra um Prompt de Comando e digite mvn -version (deverá aparecer a versão instalada)
  6. Pronto! É só utilizar

Criação de um projeto Web

Através do Prompt de Comando, vá no diretório onde deseja criar o projeto e digite

mvn archetype:generate -DgroupId=br.com.emp -DartifactId=WebAppDemo -DarchetypeArtifactId=maven-archetype-webapp