经典笔试编程题--Java实现
轉載自??經典筆試編程題--Java實現
1.輸入一個正數n,輸出所有和為n的連續正數序列。?
分析:設定兩個指針,min指向和為n的連續正數序列的最小值,max指向和為n的連續正數序列最大值。sum表示真正的和。?
初始情況下,min、max和sum 都指向1.?
當sum小于n時,max++;?
當sum大于n時,min++;?
當sum等于n時,輸出整個序列。
2.給定一個排好序的鏈表,刪除鏈表中重復的結點,返回鏈表頭指針。?
分析:(1)鏈表中重復的結點不需要保留一個,要全部刪除。?
(2)因為相同的結點全部要刪除,所以我們設定三個指針,node指向當前節點,prev指向前驅,還有一個指向后繼結點。一旦遇到node和后繼結點相等,就node++,知道沒有重復的再移動prev.?
(3)注意:頭結點也可能有重復,所以也可能被刪除,所以需要定義一個root指向頭結點。
3.對于一個有序數組,我們通常采用二分查找的方式來定位某一元素,請編寫二分查找的算法,在數組中查找指定元素。?
給定一個整數數組A及它的大小n,同時給定要查找的元素val,請返回它在數組中的位置(從0開始),若不存在該元素,返回-1。若該元素出現多次,請返回第一次出現的位置。?
分析:重點在返回第一次出現的位置。
4.對于一個字符串,請設計一個高效算法,找到第一次重復出現的字符。?
給定一個字符串(不一定全為字母)A及它的長度n。請返回第一個重復出現的字符。保證字符串中有重復字符,字符串的長度小于等于500。
方法1:這是前輩給出的算法,利用HashSet的特性,即不允許重復放入元素,所以一旦檢測到重復元素就返回false。對于本道題來說,這種方法簡潔且容易理解,能高效實現功能,但是這種方法普適性較差。
import java.util.HashSet;public class g {public static char findFirstRepeat(String A, int n) {HashSet hs=new HashSet();int length=A.length();//利用toCharArray()將String類型轉化為char類型char[] a=A.toCharArray();for(int i=0;i < length;i++){boolean b=hs.add(a[i]);//通過往hashset塞值(hashset不準有重復元素),判斷當前一段數據中是否有重復元素,一但有,立刻返回if(b==false){return a[i];}}return'0';}public static void main(String[] args) {String A = "qywyer23tdd";int n = A.length();char b = findFirstRepeat(A, n);System.out.println(b);} }方法2:利用了哈希存儲,將給定字符串以鍵值對形式存儲在哈希Map中,key就是每一個字符,value就是每個字符出現的次數。存好后再按順序遍歷Map,找出第一次出現次數不為1的即可。返回。?
注意:基于hash的存儲是很高效的一種方式,存儲鍵值對方便查找,可以根據key查找value,或者根據value查找key,或者查找特殊的字符等。
延伸:返回第一個只出現一次的字符,返回最后一個出現次數不為1的字符,返回所有出現次數為1的字符或者出現次數不為1的字符,返回給定出現次數的字符等等。
import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry;public class g {private static void findFirstRepeat(String A, int n) {int sum = 1;//新插入的key-value給value賦初始值都為1//用LinkedHashMap來存儲鍵值對//HashMap插入和輸出順序不一樣//但LinkedHashMap插入和輸出順序相同,即先存的先顯示,也就是尾插 //HashSet要求不能存重復元素,但HashMap和LinkedHashMap可以存重復元素。Map<String, Integer> hashMap = new LinkedHashMap<String, Integer>();for (int i = 0; i < n; i++) {//將main中傳過來的String類型參數一個字符一個字符的轉化為char類型,方便處理。char item = A.charAt(i); //再將每一個char類型的字符轉化為String類型。這一步操作和上一步操作作用是分離出每一個字符。String item2 = String.valueOf(item);String key = item2;// 判斷是否包含指定的鍵值boolean contains = hashMap.containsKey(key); if (contains) { // 如果條件為真sum++;hashMap.put(item2, sum);// 輸出信息 } else {sum = 1;hashMap.put(item2, sum); }} //輸出存進哈希表中的所有鍵值對System.out.println(hashMap);//以下是通過給定的value值反查key的過程//將所有的鍵值對存在一個entrySet中//遍歷entrySet,若找到value等于給定的value值,則將其對應key值存在keyList中。List<String> keyList = new ArrayList<String>(); for (Entry<String, Integer> e : hashMap.entrySet()) { if (e.getValue().equals(2)) { keyList.add(e.getKey()); } } //最后遍歷keyList,輸出第一次出現的key即可。for (String i : keyList) { System.out.println(i);break;} }public static void main(String[] args) {String A = "qywyer2333333333tdd";int n = A.length();findFirstRepeat(A, n); } }關于類型轉化問題:
(1)String---------》char / char[ ] String str = "ab"; char str1 = str.charAt(0); //得到a char str2 = str.charAt(1); //得到bchar[ ] str3 = str.toCharArray(); System.out.println (Arrays.toString(str3));(2)char / char[]-----------》String char m = 'a'; String str = String.valueOf(m); String str2 = m + " ";char[] m = {'a','b'}; String str3 = String.copyValueOf(m); String str4 = new String(m);(3)int -----------》 String int i; String s = String.valueOf(i); String s = Integer.toString(i); String s = "" + i;(4)String ----------》 intint i = Integer.parseInt([String]); i = Integer.parseInt([String],[int radix]); int i = Integer.valueOf(my_str).intValue();關于哈希存儲的處理方案(本人親試!) :
(1)根據key來查找,判斷是否包含給定的key。boolean contains = hashMap.containsKey(key); if (contains) { // 如果條件為真System.out.println("存在"+key);} else {System.out.println("不存在" + key);} (2)根據value來查找,判斷是否包含給定的value.boolean contains = hashMap.containsValue(Value); if (contains) { // 如果條件為真System.out.println("存在"+value);} else {System.out.println("不存在" +value);} (3)利用keySet遍歷所有的key值。for (Object key : hashMap.keySet()) { System.out.println("key= " + key + " value " + hashMap.get(key));} 牛課網經典例題1.合并兩個排序的鏈表?
思路:定義兩個指針,一個指向list1,一個指向List2,定義一個新鏈表,List1和list2中哪個小就復制到新鏈表中。注意判斷list1和list2是否為空!!!?
本題是利用遞歸來實現的。
處理二進制問題:?
兩個int32整數m和n的二進制表達,有多少個位(bit)不同么??
(1)m^n后,將結果賦值給一個String類型的變量,循環遍歷變量的每一位,看是否等于1.?
(2)m^n后,將二進制結果的最后一位&1,然后將二進制右移。
水仙花問題:水仙花,即給定一個三位數,每一位的數字立方加起來等于這個數本身。?
解析:
題目:從鍵盤輸入m和n,定義n是第一個數,之后的每個數都是前一個的平方根?
,一共有m個數,計算總和。
題目:Java的一維數組在不知道長度的情況下怎樣聲明?
(1) 不知道長度,所以不能直接聲明大小 import java.util.ArrayList; import java.util.List; import java.util.Scanner;public class a {public static void main(String[] args) {//用ArrayList來實現添加數據List<Integer> list = new ArrayList<Integer>(); Scanner scanner = new Scanner(System.in);System.out.println("請輸入數組");//給定一個while循環//保證輸入一串數字,直接接收,并添加到list中,當輸入0時結束輸入while(true) {int a = scanner.nextInt();if(a==0) {break;} else {list.add(a) ;}}int size = list.size();//將list轉成int型數組Integer[] array = (Integer[])list.toArray(new Integer[size]); //輸出int型數組。for(int i=0;i<array.length;i++){ System.out.print(array[i]+" "); } } }這樣就得到一個從鍵盤輸入的Int型數組,接下來就可以對數組進行各種操作。?
符合一般情況下的需要多組測試用例的情況。
題目:給定一個正整數,編寫程序計算有多少對質數的和等于這個輸入的正整數,并輸出結果,輸出值小于1000.?
測試用例:?
輸入:10?
輸出:2 ((3,7) 和(5,5))。
2 . 題目:二分查找,在左區間輸出0,右區間輸出1.?
逐漸逼近,保留6位。?
注意特殊輸入:?
(1) key值小于輸入臨界最小值或者大于臨界最大值。?
(2) 臨界最小值大于臨界最大值。?
(3) 兩個臨界值都為0,輸出0。
題目:鏡像字符串,給定兩個字符串,判斷第二個是否為第一個的鏡像字符串,是返回yes,否返回no.
import java.util.Scanner;public class b {public static Boolean count(String str1, String str2) {int p1 = 0;int p2 = 0;char[] st1 = str1.toCharArray();char[] st2 = str2.toCharArray();for (int i = 0; i < st1.length; i++) {if (st1[i] == st2[0]) {p1 = i;}}while (p1 < st1.length && p2 < st2.length) {if (st1[p1] == st2[p2]) {if (p1 == st1.length) {p1 = -1;}p1++;p2++;continue;} else {return false;}}return true;}public static void main(String[] args) throws Exception {Scanner scanner = new Scanner(System.in);System.out.println("請輸入字符串");String str1 = scanner.next();String str2 = scanner.next();if(str1.length()-str2.length()!=0) {System.out.println("no");return;}if (str1 == null || str1.length() <= 0 || str2 == null|| str2.length() <= 0) {System.out.println("error");}Boolean num = count(str1, str2);if (num.equals(true)) {System.out.println("yes");} else {System.out.println("no");}} }總結
以上是生活随笔為你收集整理的经典笔试编程题--Java实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想笔记本电脑什么配置好而且价格便宜(联
- 下一篇: Java 集合系列04之 fail-fa