這道送分題的難點在於一個常識, 如何判斷一年是不是閏年?html
public class Main { public static void main(String[] args) { int day = 0; for(int year = 2000; ; year++){ if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)){ day += 366; }else{ day += 365; } if(day % 7 == 2 && String.valueOf(year).endsWith("99")){ System.out.println(year); break; } } } }
在固定數量的數字中找出固定數量的數字, 拼湊出結果, 仍是填空題, 暴力循環.java
public class Main { public static void main(String[] args) { int num = 0; for(int a = 1; a <= 9; a++){ for(int b = 1; b <= 9; b++){ if(b == a){ continue; } for(int c = 1; c <= 9; c++){ if(c == a || c == b){ continue; } for(int d = 1; d <= 9; d++){ if(d == a || d == b || d == c){ continue; } for(int e = 1; e <= 9; e++){ if(e == a || e == b || e == c || e == d){ continue; } if(((a * 10 + b) * (c * 100 + d * 10 + e)) == ((a * 100 + d * 10 + b) * (c * 10 + e))){ num++; } } } } } } System.out.println(num); } }
<html> <img src="https://note.youdao.com/yws/public/resource/59583ca97021fbc487449f72067e1858/xmlnote/431C6CADC90744D091D7B68103BC1B66/32387" /> </html>c++
遞歸便可. 如今的目標是從左上角的'從'字到右下角的'華'字. 對於'從'字, 能夠走兩條路, 往右走或者往下走. 在矩陣中, 大部分字都像從字同樣能夠往下走或往右走. 爲有最右邊一列字不能往右走, 最下面一行字不能往下走. 在遞歸中進行判斷便可.算法
public class Main { public static void main(String[] args) { int[][] arr = { {1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7}, {4, 5, 6, 7, 8} }; System.out.println(getWays(arr)); } public static int getWays(int[][] arr){ if(arr == null || arr.length == 0){ return 0; } return process(0, 0, arr); } public static int process(int i, int j, int[][] arr){ if(i == arr.length - 1 && j == arr[0].length - 1){ return 1; } if(i == arr.length - 1){ return process(i, j + 1, arr); }else if(j == arr[0].length - 1){ return process(i + 1, j, arr); }else{ return process(i, j + 1, arr) + process(i + 1, j, arr); } } }
1 黃金數 = --------------------- 1 1 + ----------------- 1 1 + ------------- 1 1 + --------- 1 + ...
小數點後3位的值爲:0.618 小數點後4位的值爲:0.6180 小數點後5位的值爲:0.61803 小數點後7位的值爲:0.6180340 (注意尾部的0,不能忽略)
這個也不知道到搞多少次小數點後面的100位才精確. 乾脆搞它1000次. 作題的時候嘗試不一樣的循環次數, 直到結果不變.編程
public class Main { public static void main(String[] args) { BigDecimal bd = new BigDecimal(1); for (int i = 0; i < 1000; i++) { bd = bd.add(BigDecimal.ONE); bd = BigDecimal.ONE.divide(bd, 100, BigDecimal.ROUND_HALF_UP); } System.out.println(bd.toString()); } }
class Rational { private long ra; private long rb; private long gcd(long a, long b){ if(b==0) return a; return gcd(b,a%b); } public Rational(long a, long b){ ra = a; rb = b; long k = gcd(ra,rb); if(k>1){ //須要約分 ra /= k; rb /= k; } } // 加法 public Rational add(Rational x){ return ________________________________________; //填空位置 } // 乘法 public Rational mul(Rational x){ return new Rational(ra*x.ra, rb*x.rb); } public String toString(){ if(rb==1) return "" + ra; return ra + "/" + rb; } } 使用該類的示例: Rational a = new Rational(1,3); Rational b = new Rational(1,6); Rational c = a.add(b); System.out.println(a + "+" + b + "=" + c);
輸出一下題目中給的例子能夠發現, 這個Rational類就是一個黑盒, 只要給出一個分數分子和分母, 它裏面就會經過運算分別把分子和分母化爲最簡形式. 那麼分數的加法就很簡單了, 個人作法是在草稿紙上那兩個最簡分數運算一下, 走一次通分的過程就知道這個空怎麼填了.數組
new Rational(ra*x.rb+rb*x.ra, rb*x.rb)
static void sort(int[] x) { int p = 0; int left = 0; int right = x.length-1; while(p<=right){ if(x[p]<0){ int t = x[left]; x[left] = x[p]; x[p] = t; left++; p++; } else if(x[p]>0){ int t = x[right]; x[right] = x[p]; x[p] = t; right--; } else{ _________________________; //代碼填空位置 } } } 若是給定數組: 25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0 則排序後爲: -3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25 請分析代碼邏輯,並推測劃線處的代碼,經過網頁提交 注意:僅把缺乏的代碼做爲答案,千萬不要填寫多餘的代碼、符號或說明文字!!
快排的partition過程, 基礎排序內容瀏覽器
p++
例如: 用戶輸入: 2 5 6 8 11 9 10 12 9 則程序輸出: 7 9 再例如: 用戶輸入: 6 164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196 172 189 127 107 112 192 103 131 133 169 158 128 102 110 148 139 157 140 195 197 185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190 149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188 113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119 則程序輸出: 105 120 資源約定: 峯值內存消耗(含虛擬機) < 64M CPU消耗 < 2000ms 請嚴格按要求輸出,不要多此一舉地打印相似:「請您輸入...」 的多餘內容。 全部代碼放在同一個源文件中,調試經過後,拷貝提交該源碼。 注意:不要使用package語句。不要使用jdk1.6及以上版本的特性。 注意:主類的名字必須是:Main,不然按無效代碼處理。
先遍歷一遍用哈希表存起來, 直接找到重複的, 同時記錄最大值最小值. 再遍歷一遍找到缺乏的. 就兩遍, 時間複雜度O(N).ide
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String line = ""; int n = sc.nextInt() + 1; HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; int num = 0; int repeat = 0; int lack = 0; while(n-- != 0){ line = sc.nextLine(); Scanner sint = new Scanner(line); while(sint.hasNextInt()){ num = sint.nextInt(); if(map.containsKey(num)){ repeat = num; }else{ map.put(num, 1); } max = Math.max(num, max); min = Math.min(min, num); } } for(int i = min; i <= max; i++){ if(!map.containsKey(i)){ lack = i; } } System.out.println(lack + " " + repeat); } }
本題要求: 輸入兩個正整數m n, 用空格分開 (m < n < 1000*1000) 程序輸出 位於m和n之間的幸運數的個數(不包含m和n)。 例如: 用戶輸入: 1 20 程序輸出: 5 例如: 用戶輸入: 30 69 程序輸出: 8 資源約定: 峯值內存消耗(含虛擬機) < 64M CPU消耗 < 2000ms 請嚴格按要求輸出,不要多此一舉地打印相似:「請您輸入...」 的多餘內容。 全部代碼放在同一個源文件中,調試經過後,拷貝提交該源碼。 注意:不要使用package語句。不要使用jdk1.6及以上版本的特性。 注意:主類的名字必須是:Main,不然按無效代碼處理。
我以爲這題的難度在於按照位置序列刪除數後, 把數列合併起來, 我才用的方法是在數組原地調整.spa
public class Eight { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); int[] arr = new int[n]; for(int i = 0; i < arr.length; i++){ arr[i] = i * 2 + 1; } int luckyNum = 1; int count = 0; while(arr[luckyNum] < n){ for(int i = 0; i < arr.length; i++){ if((i + 1) % arr[luckyNum] == 0){ count++; }else{ arr[i - count] = arr[i];//調整 } } luckyNum++; count = 0; } int res = 0; for(int i = 0; i < arr.length; i++){ if(arr[i] > m && arr[i] < n){ res++; } } System.out.println(res); } }
題目要求: 從標準輸入讀入一個正整數N (N<1000*1000) 程序輸出該數字用數碼1~9不重複不遺漏地組成帶分數表示的所有種數。 注意:不要求輸出每一個表示,只統計有多少表示法! 例如: 用戶輸入: 100 程序輸出: 11 再例如: 用戶輸入: 105 程序輸出: 6 資源約定: 峯值內存消耗(含虛擬機) < 64M CPU消耗 < 3000ms 請嚴格按要求輸出,不要多此一舉地打印相似:「請您輸入...」 的多餘內容。 全部代碼放在同一個源文件中,調試經過後,拷貝提交該源碼。 注意:不要使用package語句。不要使用jdk1.6及以上版本的特性。 注意:主類的名字必須是:Main,不然按無效代碼處理。
這題和第2題馬虎的算式的不一樣在於, 題目給出固定的數字, 你在湊東西的時候須要把數字所有都用上. 經過全排列就能夠完成. 其餘和第2題差很少了.調試
public class Main { public static int res; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9}; f(arr, 0, n); System.out.println(res); } public static void f(int[] arr, int index, int target){ if(index == arr.length){ checkArr(arr, target); } for(int i = index; i < arr.length; i++){ swap(arr, i, index); f(arr, index + 1, target); swap(arr, i, index); } } public static void checkArr(int[] arr, int target){ int add = 0; int mol = 0; int den = 0; for(int i = 0; i < 7; i++){ for(int j = i + 1; j < 8; j++){ add = getNum(arr, 0, i); mol = getNum(arr, i + 1, j); den = getNum(arr, j + 1, 8); if(mol % den == 0 && add + (mol / den) == target){ res++; } } } } public static int getNum(int[] arr, int i, int j){ int returnNum = 0; int system = 1; for(int n = j; n >= i; n--){ returnNum += arr[n] * system; system *= 10; } return returnNum; } public static void swap(int[] arr, int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
輸入格式: 第一行是一個正整數N (1 <= N <= 50000), 表示全排列的規模。 第二行是N個不一樣的數字Pi(1 <= Pi <= N), 表示這N個數字的某一全排列。 輸出格式: 輸出一個整數,表示不一樣連號區間的數目。 示例: 用戶輸入: 4 3 2 4 1 程序應輸出: 7 用戶輸入: 5 3 4 2 5 1 程序應輸出: 9 解釋: 第一個用例中,有7個連號區間分別是:[1,1], [1,2], [1,3], [1,4], [2,2], [3,3], [4,4] 第二個用例中,有9個連號區間分別是:[1,1], [1,2], [1,3], [1,4], [1,5], [2,2], [3,3], [4,4], [5,5] 資源約定: 峯值內存消耗(含虛擬機) < 64M CPU消耗 < 5000ms 請嚴格按要求輸出,不要多此一舉地打印相似:「請您輸入...」 的多餘內容。 全部代碼放在同一個源文件中,調試經過後,拷貝提交該源碼。 注意:不要使用package語句。不要使用jdk1.6及以上版本的特性。 注意:主類的名字必須是:Main,不然按無效代碼處理。
這題繞個小彎就行. 這題的思路是先拿到每一個子區間, 兩個for循環嵌套, O(N^2). 這個時候就考驗經驗了, 判斷幾個數是否連續: 1)先排序, 排序後逐個比較是否差1. 排序算你快排代價O(NlogN), 總體O(N^3logN). 我跑過, 只得60分.
有沒有牛逼點的? 有, 判斷是否連續只須要判斷區間上的最大值和最小值之差和區間上元素個數個關係便可, 最大值和最小值在產生子區間時生成, 因此直接O(1)出答案, 總體O(N^2). 能跑滿分.
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s1 = sc.nextLine(); String s2 = sc.nextLine(); Scanner sc1 = new Scanner(s1); Scanner sc2 = new Scanner(s2); int n = sc1.nextInt(); int[] arr = new int[n]; for(int i = 0; i < n; i++){ arr[i] = sc2.nextInt(); } int count = 0; for(int i = 0; i < arr.length; i++){ int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; for(int j = i; j < arr.length; j++){ max = Math.max(max, arr[j]); min = Math.min(min, arr[j]); if((max - min + 1) == j - i + 1){ count++; } } } System.out.println(count); } }