Leetcode çözümleri | Maximum Product Subarray

Leetcode içerisinde bulunan “Maximum Product Subarray” sorusunun açıklaması ve çözümü. Bu soruda size verilen tam sayısı dizisi için, içerisindeki subarray’lerde (birbirini takip eden elemanlardan oluşan) çarpımı en fazla olan subarray’in eleman çarpımını döndürmeniz isteniyor.

➡️ Leetcode 152. Maximum Product Subarray: https://leetcode.com/problems/maximum-product-subarray/

➡️ Problem açıklaması:

Given an integer array nums, find a contiguous non-empty subarray within the array that has the largest product, and return the product.

The test cases are generated so that the answer will fit in a 32-bit integer.

A subarray is a contiguous subsequence of the array.

Example 1:

Input: nums = [2,3,-2,4]

Output: 6

Explanation: [2,3] has the largest product 6.

Example 2:

Input: nums = [-2,0,-1]

Output: 0

Explanation: The result cannot be 2, because [-2,-1] is not a subarray.

Constraints:

1 <= nums.length <= 2 * 10^4

-10 <= nums[i] <= 10

The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.

Leetcode çözümleri | Maximum Subarray | Kadane Algoritması

Leetcode içerisinde bulunan “Maximum Subarray” sorusunun açıklaması ve çözümü. Bu soruda size verilen tam sayısı dizisi için, içerisindeki subarray’lerde (birbirini takip eden elemanlardan oluşan) toplamı en fazla olan array’in eleman toplamını döndürmeniz isteniyor.

➡️ Leetcode 53. Maximum Subarray: https://leetcode.com/problems/maximum-subarray/

➡️ Problem açıklaması:

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

A subarray is a contiguous part of an array.

Example 1:

Input: nums = [-2,1,-3,4,-1,2,1,-5,4]

Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6.

Example 2:

Input: nums = [1]

Output: 1

Example 3:

Input: nums = [5,4,-1,7,8]

Output: 23

Constraints:

1 <= nums.length <= 10^5

-10^4 <= nums[i] <= 10^4

Follow up:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

Kaynaklar: https://en.wikipedia.org/wiki/Maximum_subarray_problem#Kadane’s_algorithm

JIT Derleyicisine Giriş – Constant folding ve Function folding

.NET içerisinde Common Language Runtime’ın bir parçası olan JIT compiler‘ın sağladığı özelliklerden olan “constant folding” ve “function folding” kavramlarına baktık bu videoda.

Kaynaklar:

https://en.wikipedia.org/wiki/Constant_folding

https://en.wikipedia.org/wiki/Fold_(higher-order_function)

https://sharplab.io/

https://godbolt.org/

Leetcode Çözümleri | Valid Palindrome II

Leetcode içerisinde bulunan “Valid Palindrome II” sorusunun açıklaması ve çözümü. Bu soruda size verilen bir string için, en fazla 1 karakter silerek palindrom yapılıp yapılamayacağı soruluyor. En fazla denildiği için hiç karakter silmeyebilirsiniz tabi.

➡️ Leetcode Valid Palindrome II: https://leetcode.com/problems/valid-palindrome-ii/

➡️ Problem açıklaması:

Given a string s, return true if the s can be palindrome after deleting at most one character from it.

Example 1:

Input: s = “aba”

Output: true

Example 2:

Input: s = “abca”

Output: true

Explanation: You could delete the character ‘c’.

Example 3:

Input: s = “abc”

Output: false

Constraints:

1 <= s.length <= 10^5

s consists of lowercase English letters.

Leetcode Çözümleri | Binary Search

Leetcode içerisinde bulunan “Binary Search” sorusunun açıklaması ve çözümü. Bu soruda size artan sırada verilen bir tam sayı dizisinde, O(log*n) çalışma zamanında olan bir algoritma ile verilen bir tam sayının index’ini, bu tam sayı dizide yoksa -1 döndürmeniz isteniyor. Kısaca binary search algoritmasını implement etmeniz isteniyor.

➡️ LeetCode 704. Binary Search: https://leetcode.com/problems/binary-search/

➡️ Problem açıklaması:

Given an array of integers nums which is sorted in ascending order, and an integer target, write a function to search target in nums. If target exists, then return its index. Otherwise, return -1.

You must write an algorithm with O(log n) runtime complexity.

Example 1:

Input: nums = [-1,0,3,5,9,12], target = 9

Output: 4

Explanation: 9 exists in nums and its index is 4

Example 2:

Input: nums = [-1,0,3,5,9,12], target = 2

Output: -1

Explanation: 2 does not exist in nums so return -1

Constraints:

1 <= nums.length <= 10^4

-10^4 < nums[i], target < 10^4

All the integers in nums are unique.

nums is sorted in ascending order.

Minimal API | Route Handler için Response çeşitleri

Minimal API içerisinde bir route handler’dan döndürülebilecek response çeşitlerini ele aldık bu videoda.

✅Github reposu: https://github.com/sonergonul/MinimalAPI

Response çeşitleri şu şekilde;

➡️ IResult – Task<IResult> veya ValueTask<IResult>

➡️ string – Task<string> veya ValueTask<string> – text/plain

➡️ T – Json seralize – application/json

🟢 app.MapGet("/response1", () lambda "Hello World");

🟢 app.MapGet("/response2", () => new { Message = "Hello World" });

🟢 app.MapGet("/response3", () => Results.Ok(new { Message = "Hello World" }));

🟢 app.MapGet("/response4", () => Results.Json(new { Message = "Hello World" }));

🟢 app.MapGet("/405", () => Results.StatusCode(405));

🟢 app.MapGet("/text", () => Results.Text("This is some text"));

🟢 app.MapGet("/old-path", () => Results.Redirect("/new-path"));

🟢 app.MapGet("/download", () => Results.File("C:/appsettings.json", contentType: "application/json", fileDownloadName: "appsettings.json"));

JIT Derleyicisine Giriş – Dizilerde sınır kontrolü

.NET içerisinde Common Language Runtime‘ın bir parçası olan JIT compiler‘ın dizilerin index sınırları konusunda yaptığı optimizasyonlara baktık bu videoda.

JIT compiler’ı bir dizi içerisinde eğer aynı branch’te (yani farklı bir kod akışına dallanma olmadan) büyük index’li kontrolü yaptıktan sonra kendisinden küçük index’ler için ayrı bir kontrol yapmasına gerek olmayacak şekilde optimizasyon yapıyor.

Yani

arr[2] = 3;

için 2 index’i için bir karşılaştırma yaptığında, bu satırdan daha sonra aynı brach’te;

arr[1] = 3;

şeklinde bir kodunuz varsa, ben zaten 2 için kontrol ettim, 2 index’li bir elemanı olan bir dizinin 1 index’li bir elemanı her zaman vardır şeklinde düşünüp burada bir karşılaştırma yapmayarak optimizasyona gidiyor.

Tabi bu optimizasyon farklı branch’lerde mevcut değil.

Videodaki kod bloğu;

 public void M(int[] arr) 
    {
        arr[0] = 1;
        arr[1] = 2;
        arr[2] = 3;
    }
    
    public void M1(int[] arr) 
    {
        arr[2] = 1;
        arr[1] = 2;
        arr[0] = 3;
    }

    public void M(int[] arr, int i) 
    {
        if(i == 1)
        {
            arr[0] = 1;
            arr[1] = 1;
        }
        else if(i == 2)
        {
            arr[0] = 1;
        }
    }

Kaynaklar:

https://sharplab.io

https://github.com/dotnet/coreclr/blob/master/src/jit/rangecheck.cpp

https://en.wikipedia.org/wiki/Branch_predictor

.NET MAUI Nedir? | .NET MAUI Mimarisi ve Kurulumu

.NET Multiplatform App UI (kısaca MAUI), Windows, macOS, iOS ve Android‘i hedefleyen cross platform UI uygulamaları oluşturmak için Microsoft’un yeni bir framework’ü.

.NET MAUI ile bu platformlardan herhangi birinde çalışan zengin, etkileşimli, yerel bir UI uygulaması oluşturabilirsiniz. Tek bir kod tabanı ile tüm bu platformları destekleyen ve kodun %100’ünü aralarında paylaşan bir uygulama oluşturabilirsiniz. Kısacası bir .NET dilinde bir uygulama yazıyorsunuz ve hedef platformların hiçbirinde herhangi bir değişiklik yapmadan çalışıyor. Tüm kod mantığınız bir .NET dilinde yazılabilir ve kullanıcı arayüzünüz de XAML veya seçtiğiniz .NET dilinde tanımlanabilir.

Seçtiğiniz .NET dilini (VB.Net, F# veya C#) kullanarak, .NET MAUI uygulamalarında kod yazabilirsiniz. Kullanıcı arayüzünüzü kodda da tanımlamanız mümkündür, ancak yalnızca C# ve F# desteklenir.

Bir .NET MAUI uygulamasının mimarisinin nasıl olduğunu ve bir .NET MAUI uygulamasının nasıl bir araya geldiğine bakalım;

  • En altta hedef işletim sistemimiz var (Android, iOS, macOS ve Windows). Sonraki katman, her hedef işletim sisteminde .NET MAUI uygulamamızı çalıştıracak .NET runtime’ı gösterir. Android, iOS ve macOS için bu çalışma zamanı Mono‘dur ve Windows için WinRT‘dir.
  • Bir sonraki katman, ilk abstraction katmanımız – .NET Base Class Library (BCL). BCL, .NET’in temel öğelerinin bir parçasını oluşturmayan List ve Generics gibi beklediğimiz tüm ortak dil özelliklerine erişim sağlar. Geliştirici açısından bakıldığında, .NET 5 ve .NET 6, netcoreapp ve netstandard‘ın yerini alarak hedef framework’ler haline geldi. .NET 6’da bir .NET MAUI uygulaması yazarken, tüm platformlarda BCL’ye erişiminiz olur.
  • BCL’nin üzerinde bulunan bir sonraki katman, platforma özel API’ler için soyutlamalara erişim sağlar. Android için .NET ve iOS için .NET, sırasıyla Xamarin.Android ve Xamarin.iOS‘un sonraki yinelemeleridir. Mac için .NET yeni geliştirilmiş Microsoft tarafından ancak aynı şekilde çalışır ve Windows için WinUI API’si kullanılır.
  • Son abstraction kısmı ise .NET MAUI’dir. Bu, desteklenen tüm platformlarda ortak olan UI öğeleri sağlayan birleşik bir API’dir. Bunlara layouts, buttons, text entry fields, navigation API vs. gibi örnekler verebiliriz. “Essentials” namespace’i aracılığıyla, (Xamarin‘de bu ayrı bir paketmiş bu) Bluetooth, konum hizmetleri ve cihaz depolaması gibi genel donanım özelliklerine de erişebilirsiniz.

Katmanlara aşağıdan yukarıya bakarken, bir .NET MAUI uygulaması oluşturma felsefesi yukarıdan aşağıya daha çok kabul edilir.

1- .NET MAUI kodu yazarak (örneğin, iOS veya Android kodu yerine) bir cross platform uygulaması oluşturursunuz.

2- İsterseniz, yine de uygulamanıza platforma veya işletim sistemine özel kod yazabilirsiniz, ancak bunu yapmak zorunda değilsiniz.

3- .NET MAUI, kodunuzu alır ve hedef platform için derler. .NET MAUI’nin çeşitli platformlar için uygulamanızı nasıl oluşturduğunu anlamak, bir .NET MAUI uygulaması oluşturmak için gerekli değildir, ancak bu platformları iyi anlamak faydalıdır.

.NET MAUI, Xamarin.Forms‘un bir sonraki sürümünden çok daha fazlasıdır. Xamarin, .NET’ten bağımsız olarak yüklediğiniz bir yazılım SDK’sı iken, MAUI bir workload, yani tıpkı ASP veya konsol uygulaması geliştirme gibi .NET’in bir parçasıdır.

Visual Studio içerisindeki proje template’leri:

.NET MAUI App: Bu, yeni .NET MAUI uygulamaları oluşturmak için kullanılan ana şablondur.

.NET MAUI Blazor App: Bu template, kullanıcı arabirimini tanımlamak için Blazor kullanan yeni bir .NET MAUI uygulaması oluşturmak için kullanılır.

.NET MAUI Class Library: Bu template, farklı .NET MAUI projeleri arasında kod paylaşımı için yeni bir class library oluşturur.

Tüm konuştuklarımızı özetlemek gerekirse;

1- .NET MAUI bir cross platformdur, bir kez yazılır, her yerde çalıştırılır. WORA (Write Once Run Anywhere) UI uygulama platformudur. Yalnızca bir .NET MAUI uygulaması oluşturabilirsiniz ve daha fazla değişiklik yapmadan birden çok platformda çalışacaktır.

2- .NET MAUI ile native uygulamalar yazabilirsiniz. .NET MAUI uygulamaları native uygulamalardır.

3- .NET MAUI’de web uygulamalarına göre işlevsel, performans ve güvenlik avantajları olan uygulamalar oluşturabilirsiniz.

4- .NET MAUI uygulamaları oluşturmak için tüm .NET ekosistemini kullanabilirsiniz. Bu, tüm favori NuGet paketlerinizi ve bir .NET geliştiricisi olarak tüm becerilerinizi içerir.

5- .NET MAUI uygulama kullanıcı arabirimlerini XAML, C#, F# veya Blazor’da yazabilirsiniz.

Visual Studio 2022 | DataTips penceresini sabitleme

Visual Studio 2022 17.1 Preview 2 ile birlikte, DataTips penceresini sabitleme özelliği geldi.

Şimdiye kadarki versiyonlarda datatips penceresi fareyi üzerinden çektiğiniz anda kayboluyordu ve çok derin bir listeye bakıyorsanız hepsini baştan açmanız gerekmekteydi. Doğal olarak çok sinir bozucu olabiliyor bu durum.

VS 2022 ile birlikte, bu pencereyi pencerenin dışında bir yere tıklamadığınız sürece sabitleyebileceğiniz bir özellik geldi. Bunun için Tools -- Options -- Debugging -- General kısmındaki “Keep expanded data tips open until clicked away” seçeneğini aktif edebilirsiniz.

Kaynaklar: https://docs.microsoft.com/en-us/visualstudio/releases/2022/release-notes#1712–visual-studio-2022-version-1712-newreleasebutton

JIT Derleyicisine Giriş – Loop Cloning ve Loop Hoisting

.NET içerisinde Common Language Runtime‘ın bir parçası olan JIT compiler‘ın Loop cloning ve Loop Hoisting (Loop-invariant code motion olarak ta geçiyor) konularında yaptıklarına değindik bu videoda.

Kaynaklar:

https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA+ABATARgLABQGAzAATakDCphA3oaY6QPTOkAyEEADlQDYQAdgEtBAc1IA3GBy68AEhGEBnAC6ixDJiXIpSAWRwAKUaoDaAXVIBDKFAA0pUzcfPgAShoEmpWj59a/qQAZtAmgqpOpAC8pAAMANxRADykOHGJTgDUWe6B/vTeQf62UGbCVrHWpFmkwAn5PgC++S1FjPmssjz8QhqkgHqAtqp8toCMgPmdbAAqwrzOEHwAttZ8E+0sbABC1srCkcDCUDZQqmOA+oCkiytrU6Sp16vrARtdAAowANbCKSdQAHTsGDiVQACwA/JMNp0AFQ6DB6fRYcLmKylVwRFxOTEeLw+QrFJzBIylQHAsRgmKxOKkNBoP5kkGg+5pDJxPIbfGNYpiCCqCCkZQCADuDU5TDahO5jEktlIoKUahiNhqdTFUvFjFCUCMsuOP2pSR+qXSGSNOQ5hIJhKYpXKlXlitU6uKkuK0vIAHYXUEPUKIMKQB7tbq5Qb4kaWabMsILR7rTa/vbldVavUPW7GE0YcxCE0gA===

https://en.wikipedia.org/wiki/Loop-invariant_code_motion

https://github.com/dotnet/coreclr/blob/master/src/jit/loopcloning.cpp