いくつかの典型的なアルゴリズム面接の質問に対する Java ソリューション

いくつかの典型的なアルゴリズム面接の質問に対する Java ソリューション

質問1:

  1. 公共 クラスtestClockwiseOutput {
  2. //行列を時計回りに印刷する 
  3.     
  4. @テスト 
  5. 公共  voidテスト(){
  6. int [][] num =新しい 整数[ 100 ][ 100 ];
  7. 整数n = 4 ;
  8. 整数カウント = 1 ;
  9.         
  10. ( int i = 0 ; i < n ; i++ )の場合{
  11. ( int j = 0 ; j < n ; j++ )の場合{
  12. num[i][j] = カウント++;
  13. }
  14. }
  15.         
  16. 出力(数値、 0 、n- 1 );
  17. }
  18.     
  19. 公共  void出力( int [][] num, int開始, int終了){
  20. (start>=end || end<= 0 )の場合戻り値:
  21. ( int i=start;i<=end;i++) {
  22. System.out.println(num[開始][i]);
  23. }
  24. ( int i=start+ 1 ;i<=end;i++) {
  25. System.out.println(num[i][end]);
  26. }
  27. ( int i=end- 1 ;i>=start;i--) {
  28. System.out.println(num[end][i]);
  29. }
  30. for ( int i=end- 1 ;i>start;i--){
  31. System.out.println(num[i][start]);
  32. }
  33. 出力(数値、開始+ 1 、終了- 1 );
  34. }
  35. }

質問2:

ソートされた配列と数値が与えられた場合、配列内の連続する要素の合計が指定された数値に等しいサブ配列を見つけます。

  1. // ソートされた配列と数値が与えられた場合、配列内の連続する要素の合計が指定された数値に等しいサブ配列を見つけます 
  2.     
  3. @テスト 
  4. 公共  voidテスト(){
  5. int [] num = { 1 2 2 3 4 5 6 7 8 9 };
  6. 整数合計 = 7 ;
  7. 数値、合計を求める。
  8. }
  9.     
  10. 公共  void findSum( int [] num, int sum){
  11. int左 = 0 ;
  12. int右 = 0 ;
  13.         
  14. ( int i = 0 ; i < num.length; i++) {
  15. int 現在の合計 = 0 ;
  16. 左 = i;
  17. 右 = i;
  18. (curSum<sum) {
  19. curSum += num[右++];
  20. }
  21. (現在の合計==合計)の場合{
  22. ( int j=left;j<right;j++) {
  23. System.out.print(num[j]+ " " );
  24. }
  25. システム出力のprintln();
  26. }
  27. }
  28. }

質問3:

  1. //すべての文字列は文字配列で構成されています 
  2.     
  3. @テスト 
  4. 公共  voidテスト(){
  5. //char[] cs = {'a','b','c','d','e'};  
  6. char [] cs = { 'a' 'b' 'c' };
  7. int長さ = cs.length;
  8. 再帰スワップ(cs, 0 ,長さ);
  9. }
  10.     
  11. 公共  void swap( char [] cs, intインデックス1, intインデックス2) {
  12. char temp = cs[インデックス1];
  13. cs[インデックス1]=cs[インデックス2];
  14. cs[インデックス2]=temp;
  15. }
  16.     
  17. 公共  void recursionSwap( char [] cs, int start, int length){
  18. (開始>=長さ- 1 )の場合{
  19. 印刷(cs);
  20. 戻る;
  21. }
  22. ( int i=start;i<length;i++) {
  23. swap(cs,start,i);
  24. recursionSwap(cs,開始+ 1 ,長さ);
  25. swap(cs,start,i);
  26. }
  27. }
  28.     
  29. 公共  void print( char []cs) {
  30. ( int i = 0 ; i < cs.length; i++) {
  31. System.out.print(cs[i]);
  32. }
  33. システム出力のprintln();
  34. }

質問4:

  1. //配列要素の最小数 
  2.     
  3. @テスト 
  4. 公共  voidテスト(){
  5. int [] 数値 = { 1 5 9 13 442 44 6 21 211 };
  6. qsort(数値、 0 、数値の長さ-1 );
  7. System.out.println(Arrays.toString(num));
  8. }
  9.     
  10. 公共  void qsort( int [] num, int left, int right){
  11. (左<右)の場合{
  12. intパーティション = パーティション(数値、左、右);
  13. qsort(数値、左、パーティション-1 );
  14. qsort(数値、パーティション+ 1 、右);
  15. }
  16. }
  17.     
  18. 公共  intパーティション( int [] num, int左, int右){
  19. intパーティション = num[左];
  20. (左<右) {
  21. while ((num[right]==partition || isMBigerThanN(num,num[right],partition)) && left<right){
  22. 右 - ;
  23. }
  24. swap(数値、左、右);
  25. while ((num[left]==partition || isMBigerThanN(num,partition,num[left])) && left<right){
  26. 左++;
  27. }
  28. swap(数値、左、右);
  29. }
  30.         
  31. 左に戻る;
  32. }
  33.     
  34. 公共  void swap( int [] num, int m, int n){
  35. 数値[m]を整数で割ったもの
  36. num[m] = num[n];
  37. num[n] = 一時;
  38. }
  39.     
  40. 公共 ブール型isMBiggerThanN( int [] num, int m, int n){
  41. 文字列 num1 = String.valueOf(m);
  42. 文字列 num2 = String.valueOf(n);
  43.         
  44. int temp1 = Integer.parseInt(num1+num2);
  45. int temp2 = Integer.parseInt(num2+num1);
  46.         
  47. (temp1>temp2)の場合{
  48. 戻る 真実;
  49. }
  50. それ以外{
  51. 戻る 間違い;
  52. }
  53. }

質問5:

  1. //サブ配列*** と 
  2. @テスト 
  3. 公共  voidテスト(){
  4. int [] num = { 1 ,- 2 , 3 , 10 ,- 4 , 7 , 2 ,- 5 };
  5. //int[] 数値 = {1,-2,3,10,-4,10,2,-5};  
  6. System.out.println(maxSum(num));
  7. }
  8.     
  9. 公共  int最大合計( int [] 数値) {
  10. int 現在の合計 = 0 ;
  11. int curMaxSum = -99999999 ;
  12. int開始 = 0 ;
  13. int終了 = 0 ;
  14.         
  15. ( int i = 0 ; i < num.length; i++) {
  16. (現在の合計<= 0 )の場合{
  17. カーソルの合計 = num[i];
  18. 開始 = i;
  19. }
  20. それ以外{
  21. カーソルの合計 += num[i];
  22. }
  23. (現在の合計値>現在の最大合計値)の場合{
  24. curMaxSum = curSum;
  25. 終了 = i;
  26. }
  27. }
  28. ( int i = 開始; i<=終了; i++) {
  29. System.out.println(num[i]);
  30. }
  31. curMaxSumを返します
  32. }

質問6:

  1. 公共 クラスtestMinStack {
  2. //カスタムスタック、min関数は現在の最小値を取得します 
  3.     
  4. @テスト 
  5. 公共  voidテスト(){
  6. MinStack ms =新しいMinStack();
  7. ms.push( 5 );
  8. System.out.println(ms.min());
  9. ms.push( 6 );
  10. ms.push( 2 );
  11. ms.push( 1 );
  12. System.out.println(ms.min());
  13. ms.pop();
  14. System.out.println(ms.min());
  15. ms.pop();
  16. System.out.println(ms.min());
  17.         
  18. }
  19. }
  20.  
  21. クラスMinStack{
  22. プライベートStack<Integer> minStack =新しいStack<Integer>();
  23. プライベートStack<Integer> スタック =新しいStack<Integer>();
  24.     
  25. 公共 整数ポップ(){
  26. minStack.pop();
  27. stack.pop()を返します
  28. }
  29.     
  30. 公共  voidプッシュ( int num){
  31. minStack.size()<= 0の場合{
  32. minStack.push(数値);
  33. 戻る;
  34. }
  35. 整数 min = minStack.lastElement();
  36. (数値<最小値)の場合{
  37. minStack.push(数値);
  38. }
  39. それ以外{
  40. minStack.push(min);
  41. }
  42. スタックをプッシュします。
  43. }
  44.     
  45. 公共 整数最小値(){
  46. minStack.size()<= 0の場合{
  47. 戻り値- 1 ;
  48. }
  49. minStack.lastElement()を返します
  50. }
  51. }

質問7:

  1. //配列内で半分以上出現する数字を見つける 
  2.     
  3. @テスト 
  4. 公共  voidテスト(){
  5. int [ ] num = { 1、2、2、2、2、2、2、4、2、4、6、4、2、6、8、2、7、7 } ;
  6. System.out.println(moreThanHaft(num));
  7. }
  8.     
  9. 公共  int moreThanHaft( int [] num){
  10. int結果 = - 1 ;
  11. int回 = 0 ;
  12. ( int i = 0 ; i < num.length; i++) {
  13. (回数== 0の場合{
  14. 結果 = num[i];
  15. 回++;
  16. }
  17. それ以外{
  18. if (num[i]==結果){
  19. 回++;
  20. }
  21. それ以外{
  22. 回--;
  23. }
  24. }
  25. }
  26.         
  27. 結果を返します
  28. }

質問8:

  1. //配列が別のスタックのポップ順序であるかどうかを判断します 
  2.     
  3. @テスト 
  4. 公共  voidテスト(){
  5. int [] 数値 = { 1 , 2 , 3 , 4 , 5 };
  6. //int[] num1={1,2,3,5,4};  
  7. int [] num2 = { 2 , 1 , 5 , 3 , 4 };
  8. スタック<Integer> s1 =新しいスタック<Integer>();
  9. スタック s2 =新しいスタック s2();
  10. ( int i = 0 ; i < 5 ; i++) {
  11. s2.push(num2[i]);
  12. }
  13.         
  14. System.out.println(testOrder(num,s1,s2));
  15. }
  16.     
  17. 公共 ブール型テスト順序( int [] num, Stack<Integer> s1, Stack<Integer> s2) {
  18. int長さ = num.length;
  19. ( int i = 0 ; i < 長さ; i++) {
  20. s1.push(num[i]);
  21. int s2Num = s2.lastElement();
  22. s2Num==s1.lastElement().intValue()の場合{
  23. s1.ポップ();
  24. s2.pop();
  25. }
  26. }
  27. while (!s1.isEmpty()){
  28. s1.pop() と s2.pop() が等しい場合{
  29. 戻る 間違い;
  30. }
  31. }
  32. 戻る 真実;
  33. }
  34.  
  35. コードをコピー

質問9:

  1. //ポーカーデッキから5枚のカードを引き、0は任意の数字で、ストレートかどうかを判定します 
  2.     
  3. @テスト 
  4. 公共  voidテスト(){
  5. int [] 数値 = { 0 , 1 , 5 , 3 , 2 };
  6. System.out.println(チェック(num));
  7. }
  8.     
  9. 公共 ブールチェック( int []num){
  10. //0-13  
  11. int [] pai =新しい 整数[ 14 ]
  12. ( int n : 数値)の場合
  13. pai[n]+= 1 ;
  14. }
  15. qsort(数値、 0 、数値の長さ-1 );
  16. 整数カウント = pai[ 0 ];
  17. int開始 = 0 ;
  18. (数値[ 0 ] == 0の場合{
  19. 開始=数値[ 1 ];
  20. }
  21. それ以外{
  22. 開始=数値[ 0 ];
  23. }
  24. ( int i = 開始; i <= 開始 + 5 ; i++) {
  25. (pai[i]> 1 )の場合戻り値 間違い;
  26. カウント += pai[i];
  27. }
  28. (カウント == 5 の場合、戻り値 真実;
  29. それ以外 戻る 間違い;
  30.         
  31. }
  32.     
  33. 公共  void qsort( int [] num, int left, int right){
  34. (左<右)の場合{
  35. intパーティション = パーティション(数値、左、右);
  36. qsort(数値、左、パーティション-1 );
  37. qsort(数値、パーティション+ 1 、右);
  38. }
  39. }
  40.     
  41. 公共  intパーティション( int [] num, int左, int右){
  42. intパーティション = num[左];
  43. (左<右) {
  44. while (left<right && num[right]>=パーティション){
  45. 右 - ;
  46. }
  47. swap(数値、左、右);
  48. while (左<右 && num[左]<=パーティション){
  49. 左++;
  50. }
  51. swap(数値、左、右);
  52. }
  53.         
  54. 左に戻る;
  55. }
  56.     
  57. 公共  void swap( int [] num, int m, int n){
  58. 数値[m]を整数で割ったもの
  59. 数値[m]=数値[n];
  60. num[n] = 一時;
  61. }

質問10:

  1. //k 番目の醜い数を出力します (因数は 2、3、5 のみ)  
  2.     
  3. @テスト 
  4. 公共  void test(){
  5. findUglyNum( 8 );
  6. }
  7.     
  8. 公共  void findUglyNum( intインデックス){
  9. int [] num = new   int [インデックス];
  10. int next = 1 ;
  11. num[ 0 ]= 1 ;
  12. int index2= 0 ;
  13. int index3= 0 ;
  14. int index5= 0 ;
  15.  
  16. while (next<index){
  17. int num2 = num[index2]* 2 ;
  18. int num3 = num[index3]* 3 ;
  19. int num5 = num[index5]* 5 ;
  20.             
  21. num[次] = getSuitable(num2,num3,num5);
  22.             
  23. while (num[index2]* 2 <=num[next]){
  24. index2++;
  25. }
  26. while (num[index3]* 3 <=num[next]){
  27. index3++;
  28. }
  29. while (num[index5]* 5 <=num[next]){
  30. index5++;
  31. }
  32. next++;
  33.             
  34. }
  35. System.out.println(num[index- 1 ]);
  36. }
  37.     
  38. 公共  int getSuitable( int num2, int num3, int num5){
  39. int s = num2;
  40. if (num3<s){
  41. s = num3;
  42. }
  43. if (num5<s){
  44. s = num5;
  45. }
  46. return s;
  47. }
[[137673]]

[[137673]]

<<:  Google のアルゴリズムにどんな恥ずかしいことが起こったのでしょうか?

>>:  Java における 4 つの基本的な暗号化アルゴリズムの分析

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

...

...

...

...

2019年の人工知能の予測と展望

2019 年に人工知能の分野はどのように進化するでしょうか? 過去数年と比べてどのように変化するでし...

Googleとハーバード大学がこれまでで最も複雑な3D脳マップを作成

脳の神経回路を研究するのは簡単ではありません。なぜなら、現時点では、すべてのニューロン、シナプス、そ...

ビットコインマイニング技術: 分散データストレージ、ピアツーピア伝送、コンセンサスメカニズム、暗号化アルゴリズム...

1. 説明ブロックチェーンは、オープンなデータ操作、改ざん不可能、追跡可能性、国境を越えた分散化な...

女性は人工知能によって職を失う可能性が高いのでしょうか?人工知能は本当に失業の波を引き起こすのでしょうか?

[[274542]]近年、職場における女性はあ​​らゆる方面から注目されています。女性が職場で真に...

8月1日から顔認識技術に新たな解釈が加わり、違反は法的リスクに直面することになる

[[414411]]近年、顔認識技術は、身元認証からコミュニティのアクセス制御まで幅広く使用され、多...

蘇寧電子商取引プラットフォームにおけるAI技術+短編動画の応用

[51CTO.comより引用] 2018年5月18日〜19日、51CTO主催のグローバルソフトウェア...

...

Hubo Technologyが「2019年グローバルフィンテックイノベーションTOP50」に選出されました

最近、世界をリードするインテリジェント金融検索エンジンであるHubo Technologyが「201...

AIが本当に成功する方法

[[412385]]人工知能は現在、特に自動運転車でより広く深く活用されています。人工知能を使用して...

テンセント・ユートゥと厦門大学は、トレーニングを必要としないViT構造検索アルゴリズムを提案した。

最近、ViT はコンピューター ビジョンの分野で強力な競争力を発揮し、複数のタスクで驚くべき進歩を遂...

分析と AI で注意すべき 7 つの致命的な間違い

2017年、『エコノミスト』誌は、データが石油を上回り、世界で最も価値のある資源になったと宣言しまし...