学習の感想
振り返ると、この40日間の学習記録はかなり浅いものでした。実際に学習した時間は半分程度で、一部の時間ではオンラインコースのみを見てコードを書く練習をしなかった状況でした。40日間のうち、真剣に学習できたのは約15日間程度でした。来年の試験ではこのような学習方法は避けなければなりません。
今回の試験では時間配分を間違え、良い結果を得ることができませんでした。省三の成績に終わりましたが、次回はもっと良い成績を目指します。
過去問題の練習
- 2023年ランニオ杯過去問題
- 2021年・2022年ランニオ杯過去問題
- 2023年ランニオ杯Java Bグループ省赛:問題ABD
- 2023年ランニオ杯Java Bグループ省赛:問題E
- 2022年ランニオ杯Java Bグループ省赛:問題A
- ランニオ杯2021省B 特殊年間とランニオ杯2022省B 問題統計
- ランニオ杯2020省B 整除数列、ランニオ杯2019省B 特別数の和、ランニオ杯2023省B 金属精錬
- ランニオ杯2013省B コイン裏返しとランニオ杯2015省B 移動距離
- ランニオ杯2019省B 等差数列
その他のトピック
- 日37日目:数位ソート、階乗累積和、文反転、k倍区間列
- Java基本型と入出力
- ランニオ杯の繰り返し問題
- ランニオ杯のソートとアルゴリズム問題
- 全順列
- スタックとキュー
- ソートライブラリの使用
- 文字列とStringBuilder
- ランニオ杯Java常用メソッド
- ランニオ杯eclipse デバッグ技術
- CCFCSP試験対策整理
- 再帰とユークリッドの互除法
- 文字列ソート、大文字小文字変換、フィボナッチ数列(再帰的解法)、紙のサイズ問題
- 数字反転、数字反転最適化アルゴリズム、sortソート関連、String文字列関連、StringBuilder文字列関連、HashSet関連
予想される試験範囲
接頭和、二分探索、文字列、素数、日付関連、最小公倍数と最大公約数
(階乗は2年連続で出題されていますが、今年も出題される可能性は低いと感じています)
重点復習分野
時間計算量
接頭和
二分探索の2つのテンプレート
public class BinarySearchTemplates {
public static void main(String[] args) {
// サンプル配列
int[] arr = {1, 2, 3, 4, 5, 6};
// ターゲット値 k1 と k2
int k1 = 3;
int k2 = 3;
// テンプレート1を使用してk1より小さい最大要素のインデックスを検索
int result1 = binarySearchTemplate1(arr, k1);
// テンプレート2を使用してk2以上の最小要素のインデックスを検索
int result2 = binarySearchTemplate2(arr, k2);
// 結果を出力
System.out.println("テンプレート1: [0, left] 区間はkより小さい要素を含み、[left + 1, n - 1] 区間はk以上の要素を含む");
System.out.println("k1 = " + k1 + "の場合のleftインデックス: " + result1);
System.out.println();
System.out.println("テンプレート2: [0, left - 1] 区間はkより小さい要素を含み、[left, n - 1] 区間はk以上の要素を含む");
System.out.println("k2 = " + k2 + "の場合のleftインデックス: " + result2);
}
/**
* 二分探索テンプレート1:
* ソートされた配列でターゲット値kより小さい最大要素のインデックスleftを検索
* その後、[0, left] 区間はkより小さい要素を含み、[left + 1, n - 1] 区間はk以上の要素を含む
*/
public static int binarySearchTemplate1(int[] arr, int k) {
int left = 0, right = arr.length - 1;
while (left < right) {
// 中間値を計算、右に丸めて、区間の長さが偶数の場合はmidを右端にする
int mid = left + (right - left + 1) / 2;
if (arr[mid] < k) {
// ターゲット値は右側にある
left = mid;
} else {
// ターゲット値は左側にあるかmidに等しい、ここでは減らさない、可能な解を保持するため
right = mid - 1;
}
}
// ループ終了後、[0, left] 区間はkより小さい要素を含み、[left + 1, n - 1] 区間はk以上の要素を含む
return left;
}
/**
* 二分探索テンプレート2:
* ソートされた配列でターゲット値k以上の最小要素のインデックスleftを検索
* その後、[0, left - 1] 区間はkより小さい要素を含み、[left, n - 1] 区間はk以上の要素を含む
*/
public static int binarySearchTemplate2(int[] arr, int k) {
int left = 0, right = arr.length - 1;
while (left < right) {
// 中間値を計算、通常の二分探索で左端を取る
int mid = left + (right - left) / 2;
if (arr[mid] >= k) {
// ターゲット値は左側にあるかmidに等しい、ここでは減らさない、可能な解を保持するため
right = mid;
} else {
// ターゲット値は右側にある
left = mid + 1;
}
}
// ループ終了後、[0, left - 1] 区間はkより小さい要素を含み、[left, n - 1] 区間はk以上の要素を含む
return left;
}
}
文字列関連 StringとStringBuilder
public class StringExample {
public static void main(String[] args) {
String str1 = "こんにちは、";
String str2 = " 世界!";
String str3 = "こんにちは、 世界!";
String subStr = "こんにちは";
// 文字列の長さを取得
int length = str3.length();
System.out.println("長さ: " + length);
// 文字列を比較
boolean isEqual = str1.equals(str2); // 2つの文字列の内容が等しいか比較
boolean isIgnoreCaseEqual = str1.equalsIgnoreCase(str2); // 大文字小文字を無視して比較
int compareResult = str1.compareTo(str2); // 文字列を辞書順に比較
int compareIgnoreCaseResult = str1.compareToIgnoreCase(str2); // 大文字小文字を無視して比較
System.out.println("等しい: " + isEqual);
System.out.println("大文字小文字を無視して等しい: " + isIgnoreCaseEqual);
System.out.println("辞書順比較結果: " + compareResult);
System.out.println("大文字小文字を無視した辞書順比較結果: " + compareIgnoreCaseResult);
// 部分文字列を取得
String substring = str3.substring(0, 5); // 0から5(5は含まない)の部分文字列を取得
System.out.println("部分文字列: " + substring);
// 文字列の連結
String concatenated = str1.concat(str2); // str1とstr2を連結
System.out.println("連結された文字列: " + concatenated);
// 文字列の置換
String replaced = str3.replace("世界", "皆さん"); // "世界"を"皆さん"に置換
System.out.println("置換された文字列: " + replaced);
// 文字列の分割
String[] parts = str3.split("、"); // "、"で分割
System.out.println("分割された文字列:");
for (String part : parts) {
System.out.println(part);
}
// StringBuilderの使用
StringBuilder sb = new StringBuilder();
sb.append("これは").append("StringBuilder").append("の例です");
System.out.println("StringBuilder: " + sb.toString());
// StringBuilderの変更
sb.insert(4, "簡単な");
System.out.println("挿入後: " + sb.toString());
sb.delete(4, 8); // 4から8(8は含まない)を削除
System.out.println("削除後: " + sb.toString());
sb.reverse();
System.out.println("反転後: " + sb.toString());
}
}