国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

編程面試題

2019-11-06 06:44:07
字體:
來源:轉載
供稿:網友

1、char轉換成int

int i_offset = 0;int i_count = GetValue(pBuffer+i_offset,4);i_offset += 4;DWord GetValue(const BYTE *pBuffer , int i_length){DWORD i_value=0;if (NULL==pBuffer || i_length<=0) return i_value;switch(i_length) {case 0:i_value=0;break;case 1:i_value=*pBuffer ;break;case 2:i_value=GetWORD( pBuffer );break;case 3://可能涉及到大頭 小頭; 暫時以Intel為i_value=GetWORD(pBuffer +1) + ( *pBuffer <<16);break;case 4:i_value=GetDWORD(pBuffer );break; default:break;}return i_value; }int GetWORD( const unsigned char *buffer) {unsigned int value=buffer[0] ;value<<=8 ;value+=buffer[1] ;return (int)value ;}

2、有個二級單鏈表,其中每個元素都含有一個指向一個單鏈表的指針。寫程序把這個二級鏈表展開稱一級單鏈表。

這個二級單鏈表只包括一些head:public class Link{public Link Next;public int Data;public Link(Link next, int data){this.Next = next;this.Data = data;}}public class CascadeLink{public Link Next;public CascadeLink NextHead;public CascadeLink(CascadeLink nextHead, Link next){this.Next = next;this.NextHead = nextHead;}}下面做一個二級單鏈表,GenerateLink1和GenerateLink2方法在前面都已經介紹過了:public static CascadeLink GenerateCascadeLink(){Link head1 = GenerateLink1();Link head2 = GenerateLink2();Link head3 = GenerateLink1();CascadeLink element3 = new CascadeLink(null, head3);CascadeLink element2 = new CascadeLink(element3, head2);CascadeLink element1 = new CascadeLink(element2, head1);CascadeLink head = new CascadeLink(element1, null);return head;}就是說,這些單鏈表的表頭head1、head2、head3、head4……,它們組成了一個二級單鏈表head:null –> head1 –> head2 –> head3 –> head4–>我們的算法思想是: 進行兩次遍歷,在外層用curr1遍歷二級單鏈表head,在內層用curr2遍歷每個單鏈表:public static Link GenerateNewLink(CascadeLink head){CascadeLink curr1 = head.NextHead;Link newHead = curr1.Next;Link curr2 = newHead;while (curr1 != null){curr2.Next = curr1.Next.Next;while (curr2.Next != null){curr2 = curr2.Next;}curr1 = curr1.NextHead;}return newHead;}其中,curr2.Next = curr1.Next.Next; 這句話是關鍵,它負責把上一個單鏈表的表尾和下一個單鏈表的非空表頭連接起來。

3、已知一個單向鏈表的頭,請寫出刪除其某一個結點的算法,要求,先找到此結點,然后刪除。

slnodetype *Delete(slnodetype *Head,int key){}中if(Head->number==key){Head=Pointer->next;free(Pointer);break;}Back = Pointer;Pointer=Pointer->next;if(Pointer->number==key){Back->next=Pointer->next;free(Pointer);break;}void delete(Node* p){if(Head = Node)while(p)}

4、用鏈表模擬大整數加法運算

例如:9>9>9>NULL + 1>NULL =>1>0>0>0>NULL肯定是使用遞歸啦,不然沒辦法解決進位+1問題,因為這時候要讓前面的節點加1,而我們的單鏈表是永遠指向前的。此外對于999+1=1000,新得到的值的位數(4位)比原來的兩個值(1個1位,1個3位)都多,所以我們將表頭的值設置為0,如果多出一位來,就暫時存放到表頭。遞歸結束后,如果表頭為1,就在新的鏈表外再加一個新的表頭。//head1 length > head2, so M > Npublic static int Add(Link head1, Link head2, ref Link newHead, int M, int N){// goto the endif (head1 == null)return 0;int temp = 0;int result = 0;newHead = new Link(null, 0);if (M > N){result = Add(head1.Next, head2, ref newHead.Next, M – 1, N);temp = head1.Data + result;newHead.Data = temp % 10;return temp >= 101 : 0;}else // M == N{result = Add(head1.Next, head2.Next, ref newHead.Next, M – 1, N – 1);temp = head1.Data + head2.Data + +result;newHead.Data = temp % 10;return temp >= 101 : 0;}}這里假設head1比head2長,而且M、N分別是head1和head2的長度。

5、單鏈表交換任意兩個元素(不包括表頭) 先一次遍歷找到這兩個元素curr1和curr2,同時存儲這兩個元素的前驅元素PRe1和pre2,然后大換血。

public static Link SwitchPoints(Link head, Link p, Link q){if (p == head || q == head)throw new Exception(“No exchange with head”);if (p == q)return head;//find p and q in the linkLink curr = head;Link curr1 = p;Link curr2 = q;Link pre1 = null;Link pre2 = null;int count = 0;while (curr != null){if (curr.Next == p){pre1 = curr;count++;if (count == 2)break;}else if (curr.Next == q){pre2 = curr;count++;if (count == 2)break;}curr = curr.Next;}curr = curr1.Next;pre1.Next = curr2;curr1.Next = curr2.Next;pre2.Next = curr1;curr2.Next = curr;return head;}注意特例,如果相同元素,就沒有必要交換;如果有一個是表頭,就不交換。

6、按自然序列對數字數組進行排序和按自然序列對字符串數組進行排序

import java.util.Arrays;public class SortArray {/*** 按自然序列對數字數組進行排序*/public void sortIntArray() {int[] arrayToSort = new int[] { 48, 5, 89, 80, 81, 23, 45, 16, 2 };Arrays.sort(arrayToSort);for (int i = 0; i < arrayToSort.length; i++) {System.out.println(arrayToSort[i]);}}/*** 按自然序列對字符串數組進行排序*/public void sortStringArray() {String[] arrayToSort = new String[] { “Oscar”, “Charlie”, “Ryan”,“Adam”, “David” };Arrays.sort(arrayToSort);for (int i = 0; i < arrayToSort.length; i++) {System.out.println(arrayToSort[i]);}}public static void main(String[] args) {SortArray main = new SortArray();main.sortIntArray();main.sortStringArray();}}運行結果:2516234548808189AdamCharlieDavidOscarRyan注:反自然序列:Arrays.sort(arrayToSort, Collections.reverSEOrder());

7、輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數

public class num2{public static void main(String[] args){int ywzm,space,num,other;ywzm=space=num=other=0;BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String str = null;try {str = br.readLine();} catch (IOException ex) {Logger.getLogger(num2.class.getName()).log(Level.SEVERE, null, ex);}char[] carr=str.toCharArray();for (int i = 0; i < carr.length; i++) {if((carr>=’0′)&&(carr<=’9′))num++;else if((carr>=’A'&&carr=’a'&&carr<=’z'))ywzm++;else if(carr==’ ‘)space++;elseother++;}System.out.println(“英文字母個數:”+ywzm+”/t空格個數”+space+”/t數字個數”+num+”/t其他字符個數:”+other);}}

8、偽造硬幣問題 給你一個裝有n個硬幣的袋子。n個硬幣中有一個是偽造的。你的任務是找出這個偽造的硬幣。為了幫助你完成這一任務,將提供一臺可用來比較兩組硬幣重量的儀器,利用這臺儀器,可以知道兩組硬幣的重量是否相同。試用分治法的思想寫出解決問題的算法,并計算其時間復雜度。

#include<stdlib.h>  #include<stdio.h>  #include<time.h> #define N 6void setWrong(int *coin,int n){ int i; int ran; for(i=0;i<n;i++) coin[i]=1; srand(time(0)); //隨機數種子被初始化時 ran=rand()%n; printf("jia%d/n",ran); coin[ran]=0;}/*param coin 表示需要找假硬幣的數組;param astart 前一個分組的開始;param bstart 后一個分組的開始;param n 每個分組的長度;*/int compare(int *coin,int astart,int bstart,int n){ int asum=0; int bsum=0; int i; for(i=astart;i<astart+n;i++) asum+=coin[i]; for(i=bstart;i<bstart+n;i++) bsum+=coin[i]; if(asum<bsum) return -1; if(asum==bsum) return 0; if(asum>bsum) return 1;}int find(int *coin,int start,int n){ if(n==1) { printf("第%d個是假幣",start); return start; } if((n%2)==0) { if(compare(coin,start,n/2,n/2)==-1) find(coin,start,n/2); else if(compare(coin,start,n/2,n/2)==0) return -1; else find(coin,n/2,n/2); } else { if(compare(coin,start,start+(n-1)/2,(n-1)/2)==-1) find(coin,start,(n-1)/2); else if(compare(coin,start,start+(n-1)/2,(n-1)/2)==0) find(coin,start+n-1,1); else find(coin,start+(n-1)/2,(n-1)/2); }}void main(){ int a[N]; setWrong(a,N); printf("%d",find(a,0,N));}

9、Python實現java或者.net的getHashCode()函數 hashCode在.net和java中應用很普遍,但是python沒有內置的getHashcode函數。 如下是java版本getHashcode的python實現

# -*- coding:utf-8 -*-def convert_n_bytes(n, b):bits = b*8return (n + 2**(bits-1)) % 2**bits - 2**(bits-1)def convert_4_bytes(n):return convert_n_bytes(n, 4)def getHashCode(s):h = 0n = len(s)for i, c in enumerate(s):h = h + ord(c)*31**(n-1-i)return convert_4_bytes(h)if __name__ == '__main__':print getHashCode('http://outofmemory.cn/')print getHashCode('http://outofmemory.cn/code-snMySQL-achieve-sql-server-with-lock')print getHashCode('http://outofmemory.cn/')print getHashCode('http://outofmemory.cn/code-snippet/2324/java-unit-test-usage-jMockit-mock-jingtailei')

10、刪除單鏈表中重復的元素 用Hashtable輔助,遍歷一遍單鏈表就能搞定。 實踐中發現,curr從表頭開始,每次判斷下一個元素curr.Netx是否重復,如果重復直接使用curr.Next = curr.Next.Next; 就可以刪除重復元素——這是最好的算法。唯一的例外就是表尾,所以到達表尾,就break跳出while循環。

public static Link DeleteDuplexElements(Link head){Hashtable ht = new Hashtable();Link curr = head;while (curr != null){if (curr.Next == null){break;}if (ht[curr.Next.Data] != null){curr.Next = curr.Next.Next;}else{ht[curr.Next.Data] = “”;}curr = curr.Next;}return head;}

結語: 單鏈表只有一個向前指針Next,所以要使用1-2個額外變量來存儲當前元素的前一個或后一個指針。 盡量用while循環而不要用for循環,來進行遍歷。 哇塞,我就是不用指針,照樣能“修改地址”,達到和C++同樣的效果,雖然很煩~ 遍歷的時候,不要在while循環中head=head.Next;這樣會改變原先的數據結構。我們要這么寫:Link curr=head;然后curr=curr.Next; 有時我們需要臨時把環切開,有時我們需要臨時把單鏈表首尾相連成一個環。 究竟是玩curr還是curr.Next,根據不同題目而各有用武之地,沒有定論,不必強求。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 唐河县| 甘南县| 涿州市| 哈巴河县| 鹤岗市| 万宁市| 瓦房店市| 吉首市| 镇安县| 卓资县| 益阳市| 宝应县| 洪湖市| 沙河市| 墨玉县| 琼海市| 金溪县| 武陟县| 梧州市| 普安县| 乌什县| 车致| 日喀则市| 三穗县| 固镇县| 南部县| 彩票| 阳原县| 莲花县| 太康县| 榕江县| 仁寿县| 福海县| 铜梁县| 遂川县| 防城港市| 正定县| 汉川市| 恩施市| 云霄县| 简阳市|