資料結構 陣列(5)

2021-07-05 01:47:18 字數 3382 閱讀 7433

1、數字在排序陣列中出現的次數(劍指offer--38)

題目:統計乙個數字在排序陣列中出現的次數。例如輸入排序陣列和數字3,由於3在這個陣列中出現了4次,因此輸出4.

思路:用二分查詢,分別找出第乙個3,和最後乙個3的位置,然後計算個數。

public static int getlower(int arr, int key)  else if (arr[mid] > key)  else  else 

}} if (low > high)

return -1;

return low;

} public static int getupper(int arr, int key) else if (arr[mid] > key) else else

}} if (low > high)

return -1;

return low;

} public static int getnumberofk(int arr, int key)

2、陣列中只出現一次的數(劍指offer--40)

題目:乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。

通過這道題感覺位運算很強大,這道題利用異或的幾個性質:任何數與其本身異或值都為0,異或運算滿足交換律。因此將一組數依次異或,若裡面只有乙個只出現一次的數,其他的數都出現兩次,則最後的結果必然是那個只出現一次的數。要找到兩個數字就可以先通過異或整個陣列,將得到的結果分組。然後依次安組異或就可以得到所求的值。

public static string findnums(int date, int length) 

int ansxor = 0;

for (int i = 0; i < length; i++)

int pos = findfirstone(ansxor);

int num1 =0, num2 = 0;

for (int i = 0; i < length; i++)

return num1 + "|" + num2;

} public static int findfirstone(int value)

return pos;

} public static int testbit(int value, int pos)

3、和為s的兩個數字vs和為s的連續正數序列(劍指offer--41)

題目:輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,輸出任意一對即可。

例如輸入陣列1、2、4、7、11、15和數字15。由於4+11=15,因此輸出4和11。

思路:最初我們找到陣列的第乙個數字和最後乙個數字。首先定義兩個指標,第乙個指標指向陣列的第乙個(也就是最小的)數字,第二個指標指向陣列的最後乙個(也就是最大的)數字。當兩個數字的和大於輸入的數字時,把較大的數字往前移動;當兩個數字的和小於數字時,把較小的數字往後移動;當相等時,打完收工。這樣掃瞄的順序是從陣列的兩端向陣列的中間掃瞄。

public static string findnumberswithsum(int data, int length, int sum)  else if (cursum > sum)

end--;

else

start++;

} return "";

}

題目:輸入乙個正數s,列印出所有和為s的連續正數序列(至少有兩個數)。例如輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以結果列印出3個連續序列1~5,4~6和7~8.

有了解決前面問題的經驗,這裡也考慮兩個數small和big分別表示序列的最小值和最大值。

首先把small初始化為1,big初始化為2.

如果從small到big的序列的和大於s,可以從序列中去掉較小的值,也就是增大small的值。

如果從small到big的序列的和小於s,可以增大big,讓這個序列包含更多的數字。因為這個序列至少要有兩個數字,我們一直增加small到(1+s)/2為止。

如果從small到big的序列的和等於s,輸出序列,之後增大big。

public static void findcontinuoussequence(int sum) 

system.out.println(print+"="+cursum);

big++;

cursum +=big;

} else if (cursum < sum) else

} }

4、翻轉句子中單詞的順序vs左旋字串(劍指offer--42)

題目:輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。

例如輸入「i am a student.」,則輸出「student. a am i」。

分析:由於本題需要翻轉句子,我們先顛倒句子中的所有字元。這時,不但翻轉了句子中單詞的順序,而且單詞內字元也被翻轉了。

我們再顛倒每個單詞內的字元。由於單詞內的字元被翻轉兩次,因此順序仍然和輸入時的順序保持一致。

還是以上面的輸入為例子。翻轉「i am a student.」中所有字元得到「.tneduts a ma i」,再翻轉每個單詞中字元的順序得到「students. a am i」,正是符合要求的輸出。

public static void reverse(char str, int start, int end) 

} public static void reversesentence(char str)

if (str[end] == ' ') else

} }

題目:定義字串的左旋轉操作:把字串前面的若干個字元移動到字串的尾部。 如把字串abcdef左旋轉2位得到字串cdefab。

步驟:先對每一部分旋轉,abcdefg 變成bagfedc,之後,對整個字串進行翻轉。bagfedc - cdefgab

public static void reverse(char str, int start, int end) 

} // 左旋字串(翻轉前count字元)

public static void reverseleftsentence(char str, int count)

資料結構5

第四章 字串和多維陣列 4.1 字串 4.1.1 字串的定義 字串的定義 串 零個或多個字元組成的有限序列。串長度 串中所包含的字元個數。空串 長度為0的串,記為 非空串通常記為 s s1 s2 sn 其中 s是串名,雙引號是定界符,雙引號引起來的部分是串值 si 1 i n 是乙個任意字元。子串 ...

資料結構 陣列

建立陣列 大小為50 棧空間存myarray引用 堆空間存乙個大小為50,預設值為0的陣列。棧空間myarray引用指向堆空間該陣列。int myarray new int 50 public class testarray public class testarray if s intarray....

資料結構 陣列

陣列 就是相同型別的資料按一定順序排列的集合,把有限個型別相同的資料元素用乙個名字表示,通過編號來區分。名字即為陣列名,編號即為下標。陣列是最簡單 使用最廣泛的一種資料結構,其實就是一塊連續的記憶體,哪怕物理上不連續,邏輯上也是連續的,連續存放著一組相同型別資料元素。陣列的定義 type 變數名 n...