インフラストラクチャ・カリキュラムのタイプ別に整理📋 String&Array第1弾

40503 ワード

📌 Anagram

String s = "123444a";

    int[] anagram = new int[256];

    for(int i=0;i<s.length();i++){
        anagram[s.charAt(i)]++;
    }

    for (int i : anagram) {
        System.out.print(i + " ");
    }
int配列に入るインデックスはintではなくCharなので
ここではanagram[1]の値は含まれていません.
「1」という名前のChar値を使用するため、その値に一致するインデックスに従います.

📌 文字Anagram


同じ文字列であるかどうかの問題
public class AnagramTest {
    public static void main(String[] args) {
        String ab = "abcd";
        String ba = "badc";

        int[] check = new int[256];
        for(int i=0;i<ab.length();i++){
            check[ab.charAt(i)]++;
        }
        int[] baChecking = new int[256];
        for(int i=0;i<ab.length();i++){
            baChecking[ba.charAt(i)]++;
        }
        if(Arrays.equals(check, baChecking)){
            System.out.println("true");
        }
    }
}

🎯 output

true
charatを使用して
  • Stringをint配列に入れるのが理想的です

    📌 デジタルAnagram


    2つの配列の同じ数のインデックスを返します.
    public class FindAnagramMapping {
        public static void main(String[] args) {
            int[] a = {11,27,1,324,12};
            int[] b = {27,11,324,12,1};
    
            int[] result = solution(a,b);
            for (int i : result) {
                System.out.print(i + " ");
            }
        }
    
        private static int[] solution(int[] a, int[] b) {
            int [] result = new int[a.length];
    
            Map<Integer,Integer> map = new HashMap<>();
    
            for(int i=0;i<a.length;i++){
                map.put(b[i],i);
            }
            for(int i=0;i<a.length;i++){
                result[i] = map.get(a[i]);
            }
            return result;
        }
    }

    🎯 output

    1 0 4 2 3
  • Map活用Mapにvalue,indexMap.get(value)を入れるインデックス
  • をインポートする.

    📌 同じ文字のAnagram

    public class ScratchPad {
        public static void main(String[] args) {
    
            String[] list = {"eat","tea","tan","ate","nat","bat"};
            System.out.println(solution(list));
        }
    
        private static List<List<String>> solution(String[] list) {
            /*
            list -> char
            char sorting
            sorting 한 값이 같으면 추가
            같은 값 = map
             */
            Map<String,List<String>> map = new HashMap();
            List<List<String>> result = new ArrayList<>();
    
            for(String s : list){
                char[] chars = s.toCharArray();
                Arrays.sort(chars);
                String sortingString = String.valueOf(chars);
                System.out.println(sortingString);
                System.out.println(" ==== ");
    
                if(map.containsKey(sortingString)){
                    map.get(sortingString).add(sortingString);
                }else{
                    List<String> stringList = new ArrayList<>();
                    stringList.add(s);
                    map.put(sortingString,stringList);
                }
            }
            result.addAll(map.values());
            return result;
        }
    }

    🎯 output

    [[eat, aet, aet], [bat], [tan, ant]]

  • 関数に入る前に、一番上のように注釈をつけて、接着剤を加えます.

  • String sortingString = String.valueOf(chars);
    この部分では、次のように間違っているかもしれません.
    String sortingString = Arrays.toString(chars);
    // output : [a,e,t] , [a,n,t] ....
    String sortingString = chars.toString();
    // output : 주소값 ( @[C@27d6c5e0 ) 

  • Map<String,List<String>> map = new HashMap();
    forループでこのエラーを宣言
  • 最後に値を追加した結果.addAll()を使います.
  • 🔥 いつも記憶に頼って問題を解く.自分の考えに自信がないからです.私の考え通りにずっとやってもいいです.

    📌 Priority Queue


    🎯 質問する


    2番目の数字は?
  • Arrays.sortで解決できますが、Priority Queueを利用できます.
  • public class KthLargestElementInAnArray {
        public static void main(String[] args) {
    
            Comparator<Integer> comp = (o1, o2) -> o1-o2;
    
            int[] arrays = {4,2,1,5,7,10,232};
    
            PriorityQueue<Integer> pq = new PriorityQueue<>(comp);
    
            for (Integer i :arrays) {
                pq.offer(i);
                if(pq.size()>=3){
                    pq.poll();
                }
            }
    
            System.out.println(pq.peek());
        }
    }

    🔥 idea


    優先キューの比較器、queueを定義します.size()が3を超える場合は、ポーリングを行い、2つを保持します.昇順で定義されています.
  • 第二大男-第一大男
  • このように存在します.

    📌 StringBuilderの問題


    🎯 output

    🎯 intput : "8F3Z-2e-9-wadwqdas"
    🎯 output : 8F3-Z2E9-WADW-QDAS

    🔥 idea


  • Stringを追加するときにString Builderを使うと便利です.

  • appendを使用してインデックスに追加するinsertを追加します.

  • for(int i=k;i<length;i=i+k){
    	sb.insert(length-i,"-");
    }
    後からfor loopのアイデアを追加
       String str = "8F3Z-2e-9-wadwqdas";
            int k=5;
            String solution = solution(str, k);
            System.out.println(solution);
    
        }
    
        private static String solution(String str, int k) {
            StringBuilder sb = new StringBuilder();
    
            String replace = str.replace("-", "");
            String s = replace.toUpperCase();
            int length = s.length();
    
            for(int i=0;i<length;i++){
                sb.append(s.charAt(i));
            }
    
            for(int i=k;i<length;i=i+k){
                sb.insert(length-i,"-");
            }
            String s1 = String.valueOf(sb);
            return s1;
        }

    📌 区間と最大値


    🎯 output

    🎯 input : int[] nums = {-2,1,-3,4,-1,2,1,-5,4};
    🎯 output : 6

    🔥 idea

    sum = Math.max(loop[i], sum+loop[i])
    max = Math.max(max,sum)
    sum=現在の最大値の計算
    max=現在までの最大値保存
    
    public class MaximumSubArray {
        public static void main(String[] args) {
            int[] nums = {-2,1,-3,4,-1,2,1,-5,4};
            System.out.println(solution(nums));
        }
        public static int solution(int nums[]){
            int newSum = nums[0];
            int max = nums[0];
    
            for(int i=1;i<nums.length;i++){
                newSum = Math.max(nums[i],newSum+nums[i]);
                max = Math.max(newSum,max);
            }
            return max;
        }
    }