数组
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是 O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组 1、2、4、7、11、15 和数字 15。由于 4+11=15,因此输出 4 和 11。
由于是有序的,可以用双指针来做。第一个指针i指向a[0],第二个j指向a[n-1],
若a[i]+a[j]>v,j--;
若a[i]+a[j]<v,i++;
若a[i]+a[j]=v,结束。
#include <iostream> using namespace std; void find(int a[],int n,int v) { int i=0; int j=n-1; while(i<j ) { if(a[i]+a[j]<v) { i++; } else if(a[i]+a[j]>v) { j--; } else { cout<<a[i]<<" + "<<a[j]<<" = "<<v<<endl; return; } } } void main() { int a[10]={1,3,6,8,11,13,15,17,20,22}; find(a,10,4); system("pause"); }
二叉树
题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
题目分析:可以用一个LinkedList的数据结构模拟队列来完成此操作。传入树的根节点root。
1.如果root为空则结束交换,否则root 入队。
2.当队列不为空时进行如下操作:
a.队首元素出队,交换队首元素节点的左右孩子。
b.如果队首元素的左孩子不为空,左孩子节点入队;如果队首元素的右孩子不为空,右孩子节点进栈。
算法实现:
//层序遍历,使用LinkedList数据结构来模拟队列 private void levelOrder(Node root){ if(root==null){ System.out.println("\n二叉树为空!"); return; } System.out.println("\n这是二叉排序树的层序遍历结果:"); LinkedList<Node> queue = new LinkedList<Node>(); queue.add(root); //根节点先入队 while(queue.size()!=0){ Node node = queue.removeFirst(); //得到并删除队列的第一个节点 System.out.print(node.data+" "); if(node.left!=null){ //该节点的左孩子入队 queue.add(node.left); } if(node.right!=null){ //该节点的右孩子入队 queue.add(node.right); } } System.out.println(); }
字符串
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
解题思路:对于一般字符串或整数数组是否存在某对象,或者判断对象个数问题,都可以利用hashtable来完成,这里,我们利用数组构建一个简单的hashtable,第一次遍历字符串,记录每个字符出现的次数;第二次遍历记录个数的数组,找到第一个值为1的位置对应的字符,就是本题所求的字符,代码如下:
#include <stdio.h> #include <memory.h> char firstSingle(char *str){ int arr[256]; char *pt = str; if (*pt == '\0'){ return '\0'; } memset(arr,0,sizeof(arr)); while ('\0' != *pt){ arr[*pt++]++; } while ('\0' != *str){ if (arr[*str] == 1){ return *str; } str++; } return '\0'; } int main(){ char *str = "abcddefba"; printf("%c\n", firstSingle(str)); system("pause"); return 0; }
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。
例如输入字符串"345",则输出整数345。
分析:
可以直接使用atoi函数, 但这个题目显然不希望你这么做
我们还是按照常规方法来做,比如整数字符串长度为n= strlen(str)。
最右边的为个数,往左依次是十位,百位等。
右边---左边
0 1 2 ...
比如说个数是a0, 十位为a1, 百位为a2等等, 结果为:
实现如下:
#include<iostream> #include<math.h> #include<string.h> using namespace std; int ATOI(const char* str) { int len = strlen(str); if(len == 0) return 0; int i = len -1; int j = 0; int res = 0; while(i >= 0) { res += (int(str[i]) - 48)*pow(10, j); j ++; i --; } return res; } int main() { cout << "\"345345\": " << ATOI("345345") << endl; return 0; }
其他
题目:输入一个整数,求该整数的二进制表达中有多少个1。
int BitCount(unsigned int n) { unsigned int c =0 ; // 计数器 while (n >0) { if((n &1) ==1) // 当前位是1 ++c ; // 计数器加1 n >>=1 ; // 移位 } return c ; }